差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:jna:can_t_obtain_static_method的error [2017/07/11 14:37] tony |
java:jna:can_t_obtain_static_method的error [2017/07/11 15:00] tony [How to duplicate and resolve?] |
||
---|---|---|---|
行 12: | 行 12: | ||
* 我們軟體的third-party libraries包含新版本JNA。 | * 我們軟體的third-party libraries包含新版本JNA。 | ||
* 我們軟體參考到客戶電腦中的JNA。 | * 我們軟體參考到客戶電腦中的JNA。 | ||
- | 第一個問題我透過[[http://alumnus.caltech.edu/~leif/opensource/cpcheck/CpCheckApp.html|Classpath Inspector]]確認過,並非我們問題。第二個問題,首先我透過設定CLASSPATH到環境變數中,並指定到4.3.0的jar檔路徑;可惜無法重現出問題。 | + | 第一個問題我透過[[http://alumnus.caltech.edu/~leif/opensource/cpcheck/CpCheckApp.html|Classpath Inspector]]確認過,並非我們問題。第二個問題,首先我透過設定CLASSPATH到環境變數中,並指定到4.3.0的jar檔路徑;可惜無法重現出問題(可能和service wrapper有關,無深究)。最後看了幾篇關於JNA與此相關的issue,推測應是JNA dll或so所造成的問題,所以我從jna.jar中抽取了jnidispatch.dll,並放置於PATH所設定的目錄中,就可以重現出此問題。\\ |
+ | {{:java:jna:jna_dispatch_problem_with_mismatch_dll_jar.png?600|}}\\ | ||
+ | \\ | ||
+ | 解決方式是在java啟動參數加入: | ||
+ | <code> | ||
+ | -Djna.nosys=true | ||
+ | </code> | ||
+ | 從4.1.0版本的程式碼可以得知,當宣告此變數為true時,它會使用System.loadLibrary去讀jnidispatch,反之則是從classpath中讀: | ||
+ | <code java> | ||
+ | if (!Boolean.getBoolean("jna.nosys")) { | ||
+ | try { | ||
+ | if (DEBUG_JNA_LOAD) { | ||
+ | System.out.println("Trying (via loadLibrary) " + libName); | ||
+ | } | ||
+ | System.loadLibrary(libName); | ||
+ | if (DEBUG_JNA_LOAD) { | ||
+ | System.out.println("Found jnidispatch on system path"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | catch(UnsatisfiedLinkError e) { | ||
+ | } | ||
+ | } | ||
+ | if (!Boolean.getBoolean("jna.noclasspath")) { | ||
+ | loadNativeDispatchLibraryFromClasspath(); | ||
+ | } | ||
+ | else { | ||
+ | throw new UnsatisfiedLinkError("Unable to locate JNA native support library"); | ||
+ | } | ||
+ | </code> | ||
+ | 假如客戶所裝軟體有使用到jnidispatch.dll且安裝於PATH中,就會有此問題。 | ||
===== Reference ===== | ===== Reference ===== | ||
* [[https://github.com/java-native-access/jna/blob/4.1.0/src/com/sun/jna/Native.java|JNA 4.1.0 source code]] | * [[https://github.com/java-native-access/jna/blob/4.1.0/src/com/sun/jna/Native.java|JNA 4.1.0 source code]] | ||
行 19: | 行 49: | ||
* [[https://github.com/java-native-access/jna/issues/750|JNA 4.2.2 not working on android-arm]] | * [[https://github.com/java-native-access/jna/issues/750|JNA 4.2.2 not working on android-arm]] | ||
* [[https://github.com/defold/editor2-issues/issues/1019|其它軟體類似問題]] | * [[https://github.com/defold/editor2-issues/issues/1019|其它軟體類似問題]] | ||
+ | * [[https://java-native-access.github.io/jna/4.1.0/com/sun/jna/Native.html|JNA 4.1.0 javadoc - Native]] | ||
===== ===== | ===== ===== |