我们采取以下代码
public class SomeClass {
public OtherClass method(final String param1,final String param2){
AnotherClass obj1 = AnotherClass.getInstance();
return obj.instanceMethod(new YetAnotherClass<OtherClass>() {
@Override
public OtherClass run() {
return OtherClass.get(param1, param2);
}
});
}
}
我的问题是,我可以通过JNI在C / C ++中实现接口,而无需在Java中创建本机方法吗?
答案 0 :(得分:0)
一个选项是Java Native Access(JNA)库。在JNA查看其项目页面。我引用其项目网站:
JNA为Java程序提供了对本机共享库的轻松访问,而无需编写除Java代码之外的任何内容 - 不需要JNI或本机代码。此功能可与Windows的Platform / Invoke和Python的ctypes相媲美。
项目的toturial page中的以下示例演示了如何使用它来从定义函数的本机库中调用printf
函数:
package com.sun.jna.examples;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
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]);
}
}
}
在Windows上,printf
函数在msvcrt.dll
中定义,示例加载该DLL并从中调用该函数。
JNA项目已经成熟,根据其网页,它有一些非常着名的用户。
应该指出的是,JNA本身使用了JNI,但在大多数情况下,您不需要自己使用JNI。因此,您可以专注于在C中实现本机代码(创建自己的DLL或共享库文件),然后使用JNA在Java中加载它们。