差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

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 [2023/06/25 09:48] (目前版本)
行 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]]
  
 =====    ===== =====    =====