android ndk程序UnsatisfiedLinkError解决方案
?1.UnsatisfiedlinkError:dll名稱(chēng)。說(shuō)明dll沒(méi)有放到合適的位置。對(duì)于Android開(kāi)發(fā),我們一般把so放在libs目錄下,但是還是會(huì)出現(xiàn)這個(gè)錯(cuò)誤。根本原因System.loadLibrary函數(shù)會(huì)加載你指定的so,該so中需要鏈接的所有符號(hào)都需要能夠鏈接到,如果有一個(gè)鏈接不成功,那么整個(gè)so也會(huì)加載失敗。仔細(xì)檢查so中需要的所有符號(hào),確保其存在且在正確的位置上。
???2.是UnsatisfiedlinkError:方法名稱(chēng)。說(shuō)明dll已經(jīng)成功加載,但是方法名字錯(cuò)了。這個(gè)錯(cuò)誤最最常見(jiàn)而且基本的解決方法是:仔細(xì)對(duì)比你的native 方法的原型確保與javah生成的原型一致。在java端修改native方法名稱(chēng)一定要記得更新c/c++端的函數(shù)名稱(chēng),這是造成此類(lèi)錯(cuò)誤最常見(jiàn)的原因。
???3.JNI是采用了C風(fēng)格的函數(shù)命名,所以如果用C++編譯,則必須記得在每個(gè)函數(shù)前加上extern "C"的標(biāo)記。
???4.local/global reference這些概念,只是跟jobject的指針相關(guān)(包括它的派生類(lèi)如jclass),因?yàn)檫@些指針?biāo)缚臻g,如果為local的話,則會(huì)在作用域結(jié)束時(shí)被回收,所以做cache時(shí)才需要轉(zhuǎn)化為global reference。
而jfieldID和jmethodID查看頭文件便可知與jobject無(wú)關(guān),只是一些native的空間分配,因此與local/global這些JNI加入的新概念無(wú)關(guān),按C/C++的做法去cache即可。
??5.GetStringRegion和GetStringUTFRegion的特別提醒
這兩個(gè)函數(shù)都有一個(gè)len的參數(shù),表示Unicode字符的個(gè)數(shù),但是要注意,這兩個(gè)函數(shù)會(huì)在copy完字符串后,還會(huì)操作數(shù)組的第len+1個(gè)元素(GetStringUTFRegion會(huì)把[len+1]賦值為0,但是GetStringRegion很奇怪,并不會(huì)把[len+1]賦為0)!因此分配空間時(shí)就要分配len+1,否則嘛。。你的程序隨時(shí)crash(當(dāng)你執(zhí)行delete[]時(shí))
轉(zhuǎn)載于:https://www.cnblogs.com/chenlong-50954265/p/5000019.html
總結(jié)
以上是生活随笔為你收集整理的android ndk程序UnsatisfiedLinkError解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1.1 Spring的整体架构--Spr
- 下一篇: jquery实现抽奖系统