天天看點

Android運作時報錯No implemention foundJNI程式設計

JNI程式設計

JNI程式設計需要連結C/C++動态連結庫
 JNI運作時需要連結C/C++動态連結庫
 JNI的方法名稱需要和Java的native方法嚴格對應
           

編譯時連結

編譯時,通過CMake腳本指定JNI代碼需要連結的庫
CMake常見的連結庫的方法是 先導入,再連結. 和常用的CMake腳本可能不太一樣
以連結ffmpeg的avcodec庫libavcodec.so為例:
1. add_library(avcodec SHARED IMPORTED) 導入
2. target_link_libraries(test avcodec)
           

運作時連結

apk在運作時将會尋找需要的動态庫 包括JNI代碼生成的庫以及JNI代碼生成過程連結的庫
1. 編譯能通過不代表運作也OK 
2. 通常将java代碼同級的jniLibs目錄作為庫目錄 引用的庫都放置在jniLibs/armeabi(假設filter隻有armeabi)下 這樣連結和運作時都用這個目錄 友善一些.
           

運作時報錯No implemention found

錯誤的原因在于
1. 可能找不到運作時的連結庫 檢查gradle的配置 檢視apk的依賴 分析是否打包了運作時庫
2. Jni方法名不正确 沒有和java native的包路徑對應