我在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在这里是否是一个合适的解决方案。如果有人有其他想法,请告诉我们!
亲切的问候,
杰森
答案 0 :(得分:1)
您必须编写常规C DLL并使用Java Invocation API在进程内创建Java VM并从那里调用Java程序。这样你就可以使用你想要的任何入口点。 JNA在这里没有帮助。