我在尝试在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在这里是否是合适的解决方案。如果有其他想法,请告诉我!祝好!