如何将Java程序的入口点更改为C签名?

4

我在尝试在Java程序中执行一些C代码时,玩弄了一下JNA。以下是我在网上找到的一个可行的示例(需要在构建路径中安装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程序作为入口点是正确的,但那是完全不同的方法,我也需要在那里得到帮助。 - jaySon
1
据我所知,无法将Java本地编译为DLL。因此,我不知道您为什么认为当前的方法会起作用,但就像女佣一样;我不做Windows系统。祝你好运! - Elliott Frisch
@ElliottFrisch,我已经阅读了这篇文章(https://dev59.com/f3VC5IYBdhLWcg3wihqv),虽然我还没有尝试过,但我相信这是可能的。 - jaySon
那个工具是研究级别的,它可以编译成一个.NET DLL。 - Elliott Frisch
除非你有某种超级特殊的Java设置,否则这是行不通的。Java不能“编译”成传统程序。 - Hot Licks
显示剩余4条评论
1个回答

1
你需要编写一个常规的 C DLL 并使用 Java Invocation API 在进程内创建 Java VM,然后从那里调用你的 Java 程序。这样你就可以使用任何入口点。JNA 对此无济于事。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接