JNI 筆記

  • C/C++中寫(xiě)的程序可以避開(kāi)JVM的內(nèi)存開(kāi)銷(xiāo)過(guò)大的相知合搅、處理高性能的計(jì)算牌柄、調(diào)用系統(tǒng)服務(wù)等畸悬,但是java調(diào)用jni空方法和java調(diào)用java方法相比,性能非常低的珊佣。所以一般只用來(lái)處理一些對(duì)運(yùn)算有要求蹋宦,或者需要對(duì)接口隱蔽的功能。

  • JNI 一般編寫(xiě)流程 其實(shí)就是為了避免一些錯(cuò)誤 用javah生成jni函數(shù)名咒锻,還是值得推薦使用的冷冗。驗(yàn)證過(guò),可以生成惑艇。比較使用的小技巧蒿辙。

image.png

javac src/com/example/com/enjoy/test/test.java -d ./bin
javah -jni -classpath ./bin -d ./jni com.example.com.enjoy.test.test

image.png
  • apk crash 有l(wèi)og 可以定位拇泛,程序的anr 會(huì)在記錄在/data/anr/traces.txt mtk aee log也有。
    但是NDK Crash 定位就很難了 思灌,容易出錯(cuò)的地方有 內(nèi)存地址訪問(wèn)錯(cuò)誤 使用野指針  內(nèi)存泄露  堆棧溢出  初始化錯(cuò)誤  類(lèi)型轉(zhuǎn)換錯(cuò)誤 數(shù)字除0(11/0) 等等

使用ndk-stack 進(jìn)行定位到行俺叭。


image.png
  • 因?yàn)?Java 默認(rèn)使用 Unicode 編碼,而 C/C++默認(rèn)使用 UTF 編碼,所以在本地代碼中操作字符串的時(shí)候,必須使用合適的 JNI 函數(shù)把 jstring 轉(zhuǎn)換成 C 風(fēng)格的字符串。 JNI 支持字符串在 Unicode和 UTF-8 兩種編碼之間轉(zhuǎn)換,GetStringUTFChars 可以把一個(gè) jstring 指針(指向 JVM 內(nèi)部的 Unicode字符序列)轉(zhuǎn)換成一個(gè) UTF-8 格式的 C 字符串泰偿。
    -調(diào)用完 GetStringUTFChars 之后不要忘記安全檢查,因?yàn)?JVM 需要為新誕生的字符串分配內(nèi)存空間,當(dāng)內(nèi)存空間不夠分配的時(shí)候,會(huì)導(dǎo)致調(diào)用失敗,失敗后 GetStringUTFChars 會(huì)返回 NULL,并拋出一個(gè) OutOfMemoryError 異常熄守。JNI 的異常和 Java 中的異常處理流程是不一樣的,Java 遇到異常如果沒(méi)有捕獲,程序會(huì)立即停止運(yùn)行。而 JNI 遇到未決的異常不會(huì)改變程序的運(yùn)行流程,也就是程序會(huì)繼續(xù)往下走
  • 接口找不到
    在Java中調(diào)用JNI接口時(shí)耗跛,出現(xiàn)異常裕照,察看日志,發(fā)現(xiàn)有如下錯(cuò)誤:
    WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V
    檢查了幾遍代碼调塌,Cpp中確實(shí)定義了這個(gè)接口晋南,而且仔細(xì)對(duì)照了Java的包名、類(lèi)名羔砾,確實(shí)沒(méi)有錯(cuò)誤负间,那為什么會(huì)出現(xiàn)這種問(wèn)題呢。后來(lái)突然想到蜒茄,JNI接口 都是以C的方式定義的唉擂,現(xiàn)在使用C++實(shí)現(xiàn),函數(shù)定義前是否需要加上extern "C"呢檀葛?為此定義了一個(gè)頭文件,在CPP文件中include該頭文件腹缩,頭文件加上如下代碼片斷:

ifdef __cplusplus

extern "C" {

endif

endif

...

ifdef __cplusplus

}
再次嘗試屿聋,調(diào)用成功!

  • MTK flash tool 刷機(jī)問(wèn)題 ubuntu 下刷機(jī) 出現(xiàn)了異常藏鹊。
    BROM ERROR : STATUS_ERR (-1073676287)
    STATUS_BROM_CMD_SEND_DA_FAIL
    chip mismatch MT0000

這幾個(gè)問(wèn)題  直接用ok機(jī)器的
/etc/udev/rules.d/  目錄下文件全部替換即可

jni讀寫(xiě)文件 open 時(shí)候出錯(cuò) fd 返回-1 文件節(jié)點(diǎn)權(quán)限是666
剛開(kāi)始以為是權(quán)限問(wèn)題润讥,chmod 666后發(fā)現(xiàn)還是不行使用java 文件流進(jìn)行讀寫(xiě) 發(fā)現(xiàn)讀是ok的
寫(xiě)時(shí)候出現(xiàn)異常 后面公司大神改了下驅(qū)動(dòng)  將模塊驅(qū)動(dòng)中映射的open函數(shù)直接返回0
還是不行 。
最后自己懷疑是selinux 問(wèn)題

image.png

我的avc 異常:
[ 138.125449] <6>.(6)[283:logd.auditd]type=1400 audit(1496479197.368:93): avc: denied { read write } for pid=3144 comm="m.enjoy.testjni" name="ttctl" dev="tmpfs" ino=11250 scontext=u:r:system_app:s0 tcontext=u:object_r:ttctl_device:s0 tclass=chr_file permissive=0
修改: 
/alps/device/mediatek/common/sepolicy/system_app.te
+allow system_app ttctl_device:chr_file { read write ioctl open };
還沒(méi)驗(yàn)證  下周再驗(yàn)證吧盘寡。編譯實(shí)在是太慢了楚殿。
周一了周六遺留的問(wèn)題解決了看log很重要,但是ioctl 返回值-1剩下就要看驅(qū)動(dòng)了竿痰。

-在framework PowerManger中添加 接口脆粥,update-api 發(fā)現(xiàn)mmm但編譯之后 一直報(bào)方法未重寫(xiě),但實(shí)際已經(jīng)重寫(xiě)影涉,不明原因变隔,直接根目錄下全編一次就好了。

  • 報(bào)checkJni錯(cuò)誤一般在jni映射函數(shù)中出錯(cuò)了蟹倾,比如返回類(lèi)型沒(méi)寫(xiě)對(duì)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匣缘,一起剝皮案震驚了整個(gè)濱河市猖闪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肌厨,老刑警劉巖培慌,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柑爸,居然都是意外死亡吵护,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)竖配,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)何址,“玉大人,你說(shuō)我怎么就攤上這事进胯∮米Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵胁镐,是天一觀的道長(zhǎng)偎血。 經(jīng)常有香客問(wèn)我,道長(zhǎng)盯漂,這世上最難降的妖魔是什么颇玷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮就缆,結(jié)果婚禮上帖渠,老公的妹妹穿的比我還像新娘。我一直安慰自己竭宰,他們只是感情好空郊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著切揭,像睡著了一般狞甚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廓旬,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天哼审,我揣著相機(jī)與錄音,去河邊找鬼孕豹。 笑死涩盾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巩步。 我是一名探鬼主播旁赊,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼椅野!你這毒婦竟也來(lái)了终畅?” 一聲冷哼從身側(cè)響起籍胯,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎离福,沒(méi)想到半個(gè)月后杖狼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妖爷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蝶涩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片絮识。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绿聘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出次舌,到底是詐尸還是另有隱情熄攘,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布彼念,位于F島的核電站挪圾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逐沙。R本人自食惡果不足惜哲思,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吩案。 院中可真熱鬧棚赔,春花似錦、人聲如沸徘郭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崎岂。三九已至,卻和暖如春闪湾,著一層夾襖步出監(jiān)牢的瞬間冲甘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工途样, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留江醇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓何暇,卻偏偏與公主長(zhǎng)得像陶夜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裆站,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容