2018-03-31
找不到j(luò)ni導(dǎo)出的函數(shù)??
今天和開發(fā)伙伴做智能眼鏡的對(duì)接州胳。我需要把一個(gè)同事用c++寫的tcp服務(wù)器編譯為.so動(dòng)態(tài)庫并用java通過jni封裝起來,給合作伙伴使用逸月,總之給他們提供jar包和.so動(dòng)態(tài)庫...但因?yàn)槭窃谥悄苎坨R里運(yùn)行栓撞,而智能眼鏡是android4.3,我在android studio里編譯的jar包居然因?yàn)閜roguard版本不同碗硬,而無法調(diào)用瓤湘。我一想,只有一個(gè)java文件恩尾,我就不編譯了弛说,直接給他,讓他自己加入項(xiàng)目里翰意,這總歸沒有編譯格式不同的問題了把木人。結(jié)果是成功加載了.so庫,但找不到導(dǎo)出的函數(shù)冀偶!但我用nm查看.so庫醒第,卻是有的!@#¥@....什么情況进鸠?稠曼?
后來想明白了,因?yàn)閖ni的接口格式是這樣的:包名類名函數(shù)名客年,而在java類里是直接調(diào)用函數(shù)名霞幅,忽略包名和類名的。把調(diào)用.so庫的java類直接放到項(xiàng)目中編譯搀罢,因?yàn)榘兞嘶柔匀皇钦也坏絡(luò)ni接口的(.so庫的導(dǎo)出函數(shù))
c++里調(diào)用GetMethodID時(shí)拋出NoSuchMethodError異常
在手機(jī)里運(yùn)行,沒有這個(gè)異常榔至,而在眼鏡里運(yùn)行抵赢,卻找不到j(luò)ava函數(shù)...又什么情況?弄了半天,后來才想到是不是因?yàn)檠坨R的項(xiàng)目包含jar包后release編譯铅鲤,把在java層里沒有調(diào)用到的函數(shù)優(yōu)化掉了划提,因?yàn)檫@幾個(gè)java函數(shù)是作為c++的回調(diào)函數(shù),只在.so庫里調(diào)用的邢享。立馬動(dòng)手鹏往,在java里先調(diào)用了這幾個(gè)函數(shù)后,果然可以在.so庫里通過GetMethodID找到了!!