將JNA與J9一起使用的第一個困難是J9 JVM不包含java.awt包,而Native類從該包中導入幾個類。這很容易通過下載JNA源代碼,將這些導入文件和它們的依賴方法(我還沒有使用這些方法)去除,然後構建一個新的JNA jar。將JNA與IBM J9 JVM一起使用
下面是一個簡單的測試程序:
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中的類,因爲J9顯然不具有NIO包下的NoClassDefFoundError包括:
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)
感謝您的回覆。我試圖直接使用System.load()直接加載臨時jnaXXXXXX.dll,並在嘗試訪問java.nio.Buffer時發生爆炸。看起來J9沒有包含NIO軟件包。我認爲JNA隱藏了這個錯誤,並拋出了UnsatisfiedLinkError。你也遇到過這個問題嗎? – jkschneider 2011-05-20 13:46:27
是的NIO已被排除在j9之外。如果您查看JNA中的本機代碼,實際上它調用System.Load來加載Dll。 – Abhijith 2011-05-20 14:05:40
你是對的。如果你看看上面的堆棧跟蹤,你會發現System.load()本身引用了NIO包!你如何成功解決這個問題?順便說一句,關於移回JNA 3.2.4的重要建議 - 我比使用3.2.7 jar手動翻譯的東西更加舒適。 – jkschneider 2011-05-20 17:13:07