學習jni開發遇到的幾個問題
有段時間沒進行jni開發了,上次開發的環境更多的是同時幫忙搭建的。這次自己一點點搭建,遇到一些問題。記錄下來
一、android project中加入jni目錄後一定要convert to c/c++,否則bin下不會生成class檔案,也就沒法使用別人介紹的javah命令
二、最開始,並沒有使用網上介紹的javah方法生成標頭檔案然後按照標頭檔案寫cpp檔案,而是直接自己加的cpp檔案並按照規則封裝。之後,編譯連結沒啥問題,結果run的時候報錯“NO JNI_OnLoad found...”,之後去網上找相關問題,結果眾說紛紜,後來從stackoverflow中看到說這個錯誤說的是找不到JNI_ONLOAD函式,但是引起錯誤的是別的某個原因,也沒法確定問題所在。後來按照javah方法生成標頭檔案在寫cpp檔案這個問題消失。
三、在使用網上介紹的javah方法時,在javah命令一步,剛開始出現“Could not find class file for 'com.example.godlike.MainActivity'.”,分析是沒找到java.class檔案,結果cd到class檔案所在目錄下也不好使。
[email protected]:~/work/workspace/godlike/bin/classes/com/example/godlike$ ls
BuildConfig.class MainActivity.class R.class R$drawable.class R$layout.class R$string.class
jni R$attr.class R$dimen.class R$id.class R$menu.class R$style.class
Error: Could not find class file for 'MainActivity'.
多次實驗後發現不能單純的寫MainActivity這個類名,而要寫全com.example.godlike.MainActivity,相應的-classpath的目錄也要在com之上。
四、解決了三中的小問題後,javah找到class檔案後又出現了下屬問題:
[email protected]
Error: cannot access android.app.Activity
class file for android.app.Activity not found
百度之,最後找到的解決辦法是:javah命令不能在bin下執行,cd到src目錄下後執行javah com.example.godlike.MainActivity成功。
五、這樣使用javah方法完成的jni例子也完成了,編譯run之後又出現了問題。。。意思是找不到相應的本地方法,jni中的log也沒打印出來,看來是本地方法根本就沒找到。網上找了半天,沒找到所以然,最後看到一個帖子,在此轉載過來:
java.lang.UnsatisfiedLinkError: Native method not found 三種可能解決方案
so檔案編譯生成後,執行時,有時候會遇到java.lang.UnsatisfiedLinkError: Native method not found問題,有可能是以下三種因素:
一、Jni方法頭部大小寫問題
在C++中,方法名:Java_com_XXX,而不是java_com_XXX。建議直接從生成的.h標頭檔案直接複製方法名到C或者C++檔案中。
二、C++檔案問題
如果是C++檔案(.cpp或者.cc),要使用extern "C" { } 把本地方法括進去。
三、往Jni方法中傳值問題
如,呼叫native方法sendSomeThing(Object object),如果傳入的object為null,有可能會報上面錯誤。
我實驗了下,其中的方法二解決了我的問題。
這樣jni的例子就運行了起來,達到目標。記錄下過程