Android NDK——Log

使用ndk開發jni時,Java類中的本地方法名不能有下劃線,有下劃線時函數映射會出現錯誤

昨天寫的Log程序運行起來就崩潰,檢查log信息,發現問題出在本地方法中,但一直不明白是怎麼回事,開始以爲是編譯的問題。

之前寫了一個JNI的測試程序,那個可以運行,於是對比分析了一下,發現只有本地方法的參數類型不一致,測試程序的參數都是int型,log程序是String,於是把log程序的參數也改成int型,結果運行正常。

原來在JNI中輸出log的方法__android_log_print(ANDROID_LOG_DEBUG, tag, msg);的參數是char*,直接傳jstring會報錯,對比Log源碼,發現JNIEnv中的GetStringUTFChars函數能夠把jstring轉成char*,用轉型後的char*數據就不會崩潰,當然使用GetStringUTFChars後,在char*數據用完後要調用ReleaseStringUTFChars方法釋放資源。

JVM加載庫文件後,會調用庫中的JNI_OnLoad方法,如果沒寫這個方法,會在Log信息中提示:No JNI_OnLoad found in......

java中的方法到jni中的方法有一個映射過程,映射方法有兩種,可以叫靜態和動態。

靜態方法是java中的方法到jni中的方法用一種嚴格的方式映射,最終結果是jni中的方法名必須按照特定的格式來寫,不然找不到方法。

動態方法是在上述的JNI_OnLoad方法中動態的向JVM註冊jni方法和java方法的關聯,這樣做jni中的方法名可以隨意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章