【问题标题】:How to change entry point of a Java program to a C signature?如何将 Java 程序的入口点更改为 C 签名?
【发布时间】:2015-02-25 05:40:02
【问题描述】:

我在玩弄 JNA,试图在 Java 程序中执行一些 C 代码。这是我在网上找到的一个工作示例(构建路径中需要 JNA):

package core;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class CoreController {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
                (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);

        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }

        Native.main(args);
    }
}

实际上,我正在尝试做三件(看似荒谬的)事情。

1.) 程序的入口点应更改为以下C签名:

void __stdcall RVExtension(char *output, int outputSize, const char *function);

2.) Java 程序应该能够设置给定的output 参数。
3.) 程序应编译为 DLL。

在 C++ 中,这个问题可以这样解决:

#include "stdafx.h"

extern "C" {
    __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function);
}

void __stdcall RVExtension(char *output, int outputSize, const char *function) {
    strncpy_s(output, outputSize, "IT WORKS!", _TRUNCATE);
}

所以问题是,Java 有没有可能做到这一点?如果是这样,我很高兴看到一些代码示例,因为我在这里进入了很多新领域。我什至不知道 JNA 是否是一个合适的解决方案。如果有人有其他想法,请告诉!

亲切的问候,
杰森

【问题讨论】:

  • 好吧,我想澄清一下:我想将 Java 程序的入口点更改为上面给定的 C 签名,并想从该 Java 程序中创建一个 DLL 文件。可能您将 cpp 程序作为入口点是正确的,但这是一种完全不同的方法,我也需要帮助。
  • AFAIK 无论如何都无法将 Java 本地编译为 DLL。所以我不知道你为什么认为你目前的方法会奏效,但就像女仆一样;我不做Windows。祝你好运!
  • @ElliottFrisch,我读过this,虽然我还没有尝试过,但我相信这种可能性。
  • 那个工具是研究级的,它编译成一个.NET DLL。
  • 行不通,除非你有某种超级特殊的 Java 设置。 Java 不会“编译”成常规程序。

标签: java c++ c jna entry-point


【解决方案1】:

您必须编写一个常规的 C DLL 并使用 Java Invocation API 在进程内创建一个 Java VM 并从那里调用您的 Java 程序。这样你就可以使用任何你想要的入口点。 JNA 在这里帮不上忙。

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多