錯誤1: java.lang.Unsatisfie.lang.UnsatisfiedLinkError no XXXXX in java.library.path
這個錯誤一般是找不到dll文件
執行下這個 可以看看 System.out.println(System.getProperty("java.library.path")); 其實就是我們設置的path 環境變量里的東西或者有其他系統的設置。(在windows cmd下 輸入path 或者 set 都可以看)。看了這個以后你就知道這個dll或者so文件放哪里他是可以找到了,當然最簡單的放這個java文件所在的目錄了或者他上層目錄,一般是和java src目錄同層目錄就好了,你看下java.library.path 中有個點號(.) 就表明是當前工作目錄的意思,所以肯定在工程目錄下有個位置。這個錯誤一般比較好解決。
錯誤2:java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()
這個錯誤是 在這個dll里找不到方法的聲明,(搞了一下午害我差點裝VC了,還借用到了dll查看工具)
網上說是@符號的問題 ,解決方法是用gcc 編譯的時候指定參數
第1種方法:
gcc -Wl,--kill-at -shared -o jnihello.dll Native.c
這種方法生成不帶@的函數聲明
第2種方法:
gcc -Wl,--add-stdcall-alias -shared -o jnihello22.dll Native.c
這種方法會生成2個函數聲明,一個是帶@的 一個是不帶@的。
第3種方法:
在你的本地方法的頭文件中中的函數前面加上下劃線,比如以前是
JNIEXPORT void JNICALL Java_TestNative_Hello (JNIEnv * , jobject );
現在改成
JNIEXPORT void JNICALL _Java_TestNative_Hello (JNIEnv * , jobject );
同時你的實現的cpp文件或者c文件里的函數頭也要一致 前面有下劃線。java的lang包,
如果你需要查看dll的導出函數聲明可以用以下2個工具
1: dllexp
2:Anywhere PE Viewer