将 JNA 与 J9 一起使用的第一个困难是 J9 JVM 不包含 java.awt 包,并且 Native 类从该包中导入了几个类。这很容易通过下载 JNA 源代码、删除这些导入及其依赖方法(无论如何我都没有使用)并构建一个新的 JNA jar 来克服。
这是一个简单的测试程序:
public class TestJni {
public static void main(String[] args) {
CLibrary instance = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
instance.printf("Hello, World\n", new Object[] {});
}
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
void printf(String format, Object[] args);
}
}
更正 java.awt 问题后,我收到错误:
Caused by: java.lang.UnsatisfiedLinkError: C:\DOCUME~1\TSO0112\LOCALS~1\Temp\jna72681.dll (Incompatible JNI version (not 1.1, 1.2 or 1.4))
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:973)
at java.lang.System.load(System.java:459)
at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:696)
at com.sun.jna.Native.loadNativeLibrary(Native.java:620)
at com.sun.jna.Native.<clinit>(Native.java:104)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:187)
at TestJni.main(TestJni.java:8)
“不兼容的 JNI 版本”是什么意思?有没有人让 J9 与 JNA 配合得很好?
更新:我认为 JNA 在尝试加载 java.nio.Buffer 类时抑制了以下 NoClassDefFoundError,因为 J9 显然没有包含 NIO 包:
JNA: Problems loading core IDs: java.nio.Buffer
Exception in thread "main" java.lang.NoClassDefFoundError: java.nio.Buffer
at java.lang.ClassLoader.loadLibraryWithPath(Native Method)
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:965)
at java.lang.System.load(System.java:459)
at TestJni.main(TestJni.java:8)
最佳答案
我已经在 j9 上与 JNA 合作几个月了。我在这里和那里遇到了一些小问题,但大多数事情似乎都运行良好。
首先 - 最新版本的 JNA(3.2.7) 似乎导入了 awt。我使用的是 3.2.4,awt 导入被注释掉了。我认为这对您来说是开箱即用的。
其次 - 我正在使用的 J9 版本适用于 WinCE,它是适用于 Java 1.4 的 JVM。最新的 JNA 虽然是基于 Java 1.5 构建的。所以你可能想检查你的 j9 版本是基于哪个版本的 java 构建的。我相信 JNA 3.2.4 与 java 1.4 兼容。
关于java - 将 JNA 与 IBM J9 JVM 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064562/