差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:jna:can_t_obtain_static_method的error [2017/07/11 14:43]
tony [Reference]
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檔路徑;可惜無法重現出問題。最後看了幾篇關於JNA與此相關的issue,推測應是JNA dll或so所造成的問題,所以我從jna.jar中抽取了jnidispatch.dll,並放置於PATH所設定的目錄中,就可以重現出此問題。\\+第一個問題我透過[[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:​jna:​jna_dispatch_problem_with_mismatch_dll_jar.png?​600|}}\\
 \\ \\
行 19: 行 19:
 -Djna.nosys=true -Djna.nosys=true
 </​code>​ </​code>​
-可以讓jna只去讀軟體設定classpath+從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]]