2011-05-19 56 views
3

將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) 

回答

1

我一直在JNA上工作j9好幾個月了。我在這裏和那裏都有一些小小的煩惱,但大部分似乎工作正常。

首先 - 最新版本的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兼容。

+0

感謝您的回覆。我試圖直接使用System.load()直接加載臨時jnaXXXXXX.dll,並在嘗試訪問java.nio.Buffer時發生爆炸。看起來J9沒有包含NIO軟件包。我認爲JNA隱藏了這個錯誤,並拋出了UnsatisfiedLinkError。你也遇到過這個問題嗎? – jkschneider 2011-05-20 13:46:27

+0

是的NIO已被排除在j9之外。如果您查看JNA中的本機代碼,實際上它調用System.Load來加載Dll。 – Abhijith 2011-05-20 14:05:40

+0

你是對的。如果你看看上面的堆棧跟蹤,你會發現System.load()本身引用了NIO包!你如何成功解決這個問題?順便說一句,關於移回JNA 3.2.4的重要建議 - 我比使用3.2.7 jar手動翻譯的東西更加舒適。 – jkschneider 2011-05-20 17:13:07

0

你也可以簡單地提供java.nio/java.awt的東西你自己的存根實現,並避免使用這些功能(主要是直接緩衝區的東西,並獲得本地窗口的句柄)。

+0

哦,相信我,我試過......說起來容易做起來難。主要是因爲JNA實際上確實需要Buffer類。 – jkschneider 2011-09-02 20:37:57

+0

我不確定你的意思。 JNA指的是java.nio.Buffer和java.awt,但如果在類路徑中包含自己的(空)JNA之前的實現,則一切都應該正常運行。 – technomage 2011-10-04 15:22:07