參考
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、成都網(wǎng)站制作與策劃設(shè)計(jì),武陵網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:武陵等地區(qū)。武陵做網(wǎng)站價格咨詢:028-86922220
在
這篇文章中征程的apk:JniTest.apk把后綴改為JnitTest.zip,打開這個文件,在lib下面會有生成好的.so文件,copy出來。
可以發(fā)現(xiàn)這個.so文件叫l(wèi)ibMyTest.so。
然后把這個so文件copy到新的項(xiàng)目的libs\armeabi下,使用和正常的.so文件一樣。然后修改app的gradle中的android節(jié)點(diǎn)中加入:
然后在main\java 建立生成.so文件那個項(xiàng)目的包名, 把NdkJniUtils文件copy過來。當(dāng)然封裝成jar包更好啦。
到此完成,調(diào)用NdkJniUtils的方法即可獲得.so文件中的內(nèi)容。
01
安卓手機(jī)打開.so文件需要下載Native Libs Monitor這個app,這個應(yīng)用可以幫助我們理解手機(jī)上安裝的APK用到了哪些.so文件,以及.so文件來源于哪些函數(shù)庫或者框架。我們也可以自己對app反編譯來獲取這些信息。
so文件是手機(jī)的一些運(yùn)行庫文件,在系統(tǒng)lib的文件夾下,置換移植其他系統(tǒng)的程序也需要修改更換相關(guān)so文件;沒有它系統(tǒng)軟件不能運(yùn)行,哪部分損壞就影響相對功能,電話接打,通訊錄,相機(jī)等等都是要依賴so文件使用的。so文件需要資深安卓大師更改,一般都是現(xiàn)成的搬運(yùn)移植,打開它沒有什么意義。安卓手機(jī)想要查看.so文件就需要下載Native Libs Monitor。
so是shared object的縮寫,見名思義就是共享的對象,機(jī)器可以直接運(yùn)行的二進(jìn)制代碼。大到操作系統(tǒng),小到一個專用軟件,都離不開so。so主要存在于Unix和Linux系統(tǒng)中。so是與平臺相關(guān)的二進(jìn)制機(jī)器碼,Android應(yīng)用支持的cpu架構(gòu)取決于APK中位于lib或jniLib目錄中的.so文件。
由于Android基于Linux Kernl的,也繼承了Linux中所有so相關(guān)的設(shè)計(jì)。
除了系統(tǒng)方面的原因,Android開發(fā)者還要知道以下幾點(diǎn):
so機(jī)制讓開發(fā)者最大化利用已有的C和C++代碼,達(dá)到重用的效果,利用軟件世界積累了幾十年的優(yōu)秀代碼。
so是二進(jìn)制,沒有解釋編譯的開消,用so實(shí)現(xiàn)的功能比純java實(shí)現(xiàn)的功能要快。
so內(nèi)存分配不受Dalivik/ART的單個應(yīng)用限制,減少OOM。
我們在Android應(yīng)用程序會常常的加載一些So文件來完成我們的目標(biāo),那么我們的APK加載So是有哪些平時我們沒有注意到的事情呢?
1. 首先我們一般開發(fā)會遇見兩種APK(其實(shí)一般大部分只會遇到一種),一種為系統(tǒng)級APK,另外一種為普通APK。那么這個兩種APK跟So加載有什么關(guān)系呢?別急,讓我們先聊聊我們那些操作會產(chǎn)生這些類型的APK。
普通級AKP:?
pm install +?包名將會把APK安裝到 /data/app 目錄下,同時會把So映射到/data/app-lib/包命/ 目錄下。這個就是普通的APK(pm Install -r 會替換原有的APK,當(dāng)然必須是一樣的簽名)。
系統(tǒng)級APK:
push? + 絕對路徑 + 包名 /system/app 目錄下(必須把原有的包名刪除哦?。?,這時APK就會在System/app下面了,這時你需要把你的APK的So 同時push到system/lib里面。因?yàn)閍pk里面的So并不會自動映射到system/lib下面。
一般我們在使用加載So的方法時候,會使用到System.load(pathName)和?System.loadLibrary(libName)這兩種方法。這篇文章主要講講System.load(pathName)這個絕對路徑加載的注意點(diǎn)。
我們通常會直接使用
context.getApplicationInfo().nativeLibraryDir +/具體名字.so? 來讓系統(tǒng)幫我尋找加載So所需要的路徑。那么這里問題就來了。
如果是系統(tǒng)級APK
context.getApplicationInfo().nativeLibraryDir = /system/lib/
如果是普通級APK
context.getApplicationInfo().nativeLibraryDir ?=/data/data-lib/PackageName/ 對!就是那個映射的So系統(tǒng)會根據(jù)這個去data/app/包名下面尋找真正的So文件。
這個需要注意的細(xì)節(jié),主要用于在中間件,系統(tǒng)預(yù)置程序的研發(fā)人員與測試上面。我們在拿到芯片廠商給予調(diào)試模式的開發(fā)硬件上進(jìn)行Demo和So的更換測試的時候,需要自己和測試都需要知道,自己安裝的APK是什么類型,會加載什么路徑,以免我們的底層老司機(jī)在幫忙測試問題的時候造成不必要的麻煩。
SO文件格式即ELF文件格式,它是Linux下可執(zhí)行文件,共享庫文件和目標(biāo)文件的統(tǒng)一格式。TOC這個詞其實(shí)是從出版界借用過來的,指的就是每一本書正文前面的“目錄”,它的作用地球人都知道:如果想快速找到書中某一內(nèi)容,可以先查TOC,然后按照TOC指明的頁碼直接翻即可。
由于Android操作系統(tǒng)的底層基于Linux系統(tǒng),所以SO文件可以運(yùn)行在Android平臺上。Android系統(tǒng)也同樣開放了C/C++接口供開發(fā)者開發(fā)Native程序。由于基于虛擬機(jī)的編程語言JAVA更容易被人反編譯,因此越來越多的應(yīng)用將其中的核心代碼以C/C++為編程語言,并且以SO文件的形式供上層JAVA代碼調(diào)用,以保證安全性。
so文件是unix的動態(tài)連接庫,是二進(jìn)制文件,作用相當(dāng)于windows下的.dll文件。
補(bǔ)充:
在Android中調(diào)用動態(tài)庫文件(*.so)都是通過jni的方式。
Android中加載so文件的提供的API:
void System.load(String pathName);
說明:pathName:文件名+文件路徑;
當(dāng)前題目:android的so文件,android 編譯so文件
分享鏈接:http://jinyejixie.com/article38/dsdigpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站排名、搜索引擎優(yōu)化、手機(jī)網(wǎng)站建設(shè)、小程序開發(fā)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)