android studio __android_log_print 問題

分類: Android平臺




最近在使用android studio編譯安卓程序,要用到jni
我在jni源碼中引用了__android_log_print ,且在Android.mk中加了LOCAL_LDLIBS := -llog
但是編譯時還是會出現如下錯誤:
Error:(82) undefined reference to `__android_log_print'
原因:
默認情況下,存在src/main/jni文件夾時,gradle生成腳本會執行ndk編譯生成操作,但是,編譯生成方式並不是像以前那樣用ndk-build去處理Android.mk Application.mk等
進行c/c++代碼的編譯鏈接,而是在臨時文件路徑中重新生成了一份新的mk文件,並以此作爲ndk編譯項目,所以會導致log庫沒有被正常鏈接進去,導致找不到定義。

解決方法:
通過在app目錄下的build.gradle中
android { 
加入配置: (注意是加在android {}之中)
sourceSets.main {
    jni.srcDirs = []
    jniLibs.srcDir 'src/main/libs'
}
的方式來屏蔽掉默認的jni編譯生成過程,這樣執行gradle生成時就不會再處理jni中的原生代碼,而由手動調用ndk-build方式去生成so動態鏈接庫,同時下面的jniLibs.srcDir重定位生成庫文件夾爲ndk-build默認生成的libs文件夾(這個默認是src/main/jniLibs,當然是默認生成jni腳本執行成功的話,如果想保留不變的話也可以修改一下手動執行ndk-build時的生成路徑),這時再調試運行就可以正確的嵌入native庫文件執行了。
進入jni目錄,手動運行ndk-build

如果要自動進行ndk-build,在加上面配置的基礎上(注意可加在最後面,不能在android {}之中)
在build.gradle後面加上
task ndkBuild(type: Exec) {
   commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}
作者:帥得不敢出門   程序員羣:31843264
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章