1、引入第三方庫:
(下面說的不是引入像百度地圖的so庫那樣小槐,百度地圖除了so庫還有jar包拇派,這里是沒有jar包的,要用JNI 調(diào)用第三方so庫里的方法)
指定平臺:在app的build.gradle中的android/defaultConfig中添加
高版本的NDK(16以上)不能包含armeabi,會報CMake Error:CMAKE_C_COMPILER not set的錯誤凿跳。
指定AAR包到lib下:
指定庫在項目的app/libs中
如果在src/main下創(chuàng)建一個jniLibs文件件豌,把so庫放在里面就不需要像上面那樣指定。
2控嗜、cmake.txt 配置
這是添加一個茧彤,如果添加多個 重復(fù)上面的兩個方法
如果是多個c/cpp文件把上面的src/main/cpp/native-jni.c 在下面復(fù)制一份,native-jni.c改為另外一個c/cpp的文件名疆栏。
系統(tǒng)在編譯的時候需要鏈接庫曾掂,所以把第三方庫和我們自己寫JNI生成的庫都放進去,第三方庫的引入就完成了(多個so庫就添加多個庫到方法里)
如果要本地不同的C文件生成多個so庫target_link_libraries也需要多個
如果想在項目中添加系統(tǒng)庫本來就有的庫可以用這個壁顶。
3珠洗、拆分文件:
首先動態(tài)注冊的方式創(chuàng)建了一個native_diff對應(yīng)java中的diff方法。
java代碼:
傳入原文件的路徑和子文件的路徑若专;
c代碼:
拆分之后SD卡中就會多出video_0.mp4,video_1.mp4等4個文件许蓖。
為什么申請一個二級指針:第一級存儲文件名指針的地址,二級存文件名的字符调衰。
假如是一級指針膊爪,只能表示一個文件名或每個字符不能寫一個字母或數(shù)字不能寫文件名,所以不能組成多個文件的數(shù)組嚎莉。
4米酬、文件的合并:
java代碼 :只是增加了一個方法
C代碼:
5、java線程和jni線程:
java方法和jni方法運行在同一個線程萝喘。adb logcat -v threadtime > F:\log\thread.log
java方法:
newJniThread創(chuàng)建線程淮逻,setJniEnv初始化 jvm 和 jobject。
c代碼:
兩個全局變量
下面是創(chuàng)建的線程執(zhí)行的函數(shù)
怎么看創(chuàng)建的線程呢阁簸?
adb logcat -v threadtime >D:log\thread.log命令得到log日志
“new thread”還是在主線程中 后來的線程id 17043 爬早、17044都變了
上面的代碼j_obj會引起內(nèi)存泄漏,解決辦法:在寫一個native方法启妹,在方法里釋放這個全局引用(*env)->DeleteGlobalRef(env,j_obj),然后在activity的onDestory方法中調(diào)用這個native方法筛严。