差異處

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

連向這個比對檢視

下次修改
前次修改
java:jna:can_t_obtain_static_method的error [2017/07/11 13:56]
tony 建立
java:jna:can_t_obtain_static_method的error [2023/06/25 09:48] (目前版本)
行 2: 行 2:
 ====== Can't obtain static method的Error ====== ====== Can't obtain static method的Error ======
 ===== Problem ===== ===== Problem =====
 +有天某個客戶說我們的軟體服務無法啟動,傳回來的debug log中,包含以下錯誤:​
 +<​code>​
 +java.lang.UnsatisfiedLinkError:​ Can't obtain static method fromNative(Method,​ Object) from class com.sun.jna.Native ​
 +</​code>​
  
 ===== How to duplicate and resolve? ===== ===== How to duplicate and resolve? =====
 +首先這個問題是由於JNA版本不同造成的。我們使用4.1.0版本的JNA,com.sun.jna.Native中並沒有fromNative(Method,​ Object),確認過JNA GitHub後,這應是4.3.0後加入的method。\\ 
 +因此,面對此問題,我懷疑可能是:​ 
 +  * 我們軟體的third-party libraries包含新版本JNA。 
 +  * 我們軟體參考到客戶電腦中的JNA。 
 +第一個問題我透過[[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]]
   * [[https://​github.com/​java-native-access/​jna/​blob/​4.3.0/​src/​com/​sun/​jna/​Native.java|JNA 4.3.0 source code]]   * [[https://​github.com/​java-native-access/​jna/​blob/​4.3.0/​src/​com/​sun/​jna/​Native.java|JNA 4.3.0 source code]]
 +  * [[https://​github.com/​java-native-access/​jna/​issues/​384|jna.nosys=true should be default]]
 +  * [[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://​java-native-access.github.io/​jna/​4.1.0/​com/​sun/​jna/​Native.html|JNA 4.1.0 javadoc - Native]]
  
 +=====    =====
 +----
 +\\
 +~~DISQUS~~