已了解解決方案: 1.將SO文件直接放到libs/armeabi下,然后代碼中System.loadLibrary("xxx");再publicnativestaticintxxx_xxx_xxx();接下來就可以直接調(diào)用xxx_xxx_xxx()方法; 2.第二種方案,創(chuàng)建自己的SO文件,在自己的SO文件里調(diào)用第三方SO,再在程序中調(diào)用自己的SO,這種比較復(fù)雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件并實現(xiàn)相應(yīng)方法,最后用androidNDK開發(fā)包中的ndk-build腳本生成對應(yīng)的.so共享庫;求解: 網(wǎng)上說的第二種方案,是自己引用so庫,最后聲稱JAR ------解決方案-------------------------------------------------------- 首先要看這個SO是不是JNI規(guī)范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調(diào)用。如果答案是否定的,你只能選第二個方案。 如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。 一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調(diào)用文件。 1、這個要看這個SO是不是符合JNI調(diào)用的規(guī)范。還要看你自己的意愿。 2、因為第二種方法最靈活,各種情況都可以實現(xiàn)。3、可以------解決方案-------------------------------------------------------- 看能不能直接從JAVA調(diào)用的最簡單的方法就是看SO里的函數(shù)名是不是Java_XXX_XXX_XXX格式的 是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數(shù)名和JAVA函數(shù)名的轉(zhuǎn)換規(guī)則,或者向SO提供方索要; 不是的話就選第二種方案吧。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供土默特左旗網(wǎng)站建設(shè)、土默特左旗做網(wǎng)站、土默特左旗網(wǎng)站設(shè)計、土默特左旗網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、土默特左旗企業(yè)網(wǎng)站模板建站服務(wù),十年土默特左旗做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
假設(shè)你的library文件名是libmylibrary.so。
如果你的libmylibrary.so文件是在系統(tǒng)library的路徑中(比如/system/lib, /system/vendor/lib等目錄), 使用以下方法調(diào)用:
System.loadLibrary("mylibrary");
如果你的libmylibrary.so文件不再系統(tǒng)路徑中, 比如/data/data/com.company.example/libmylibrary.so,使用以下方法調(diào)用(用絕對路徑):
System.load("/data/data/com.company.example/libmylibrary.so");
如果以上兩條路均不通, 使用終極大法,在native code中
#include dlfcn.h
然后,使用dlopen()函數(shù)load library,然后用dlsym()映射想要的函數(shù)入口,然后調(diào)用想要的函數(shù)。
安卓手機打開.so文件需要下載Native Libs Monitor這個app,這個應(yīng)用可以幫助我們理解手機上安裝的APK用到了哪些.so文件,以及.so文件來源于哪些函數(shù)庫或者框架。我們也可以自己對app反編譯來獲取這些信息。
so文件是手機的一些運行庫文件,在系統(tǒng)lib的文件夾下,置換移植其他系統(tǒng)的程序也需要修改更換相關(guān)so文件;沒有它系統(tǒng)軟件不能運行,哪部分損壞就影響相對功能,電話接打,通訊錄,相機等等都是要依賴so文件使用的。so文件需要資深安卓大師更改,一般都是現(xiàn)成的搬運移植,打開它沒有什么意義。安卓手機想要查看.so文件就需要下載Native Libs Monitor。
so是shared object的縮寫,見名思義就是共享的對象,機器可以直接運行的二進制代碼。大到操作系統(tǒng),小到一個專用軟件,都離不開so。so主要存在于Unix和Linux系統(tǒng)中。so是與平臺相關(guān)的二進制機器碼,Android應(yīng)用支持的cpu架構(gòu)取決于APK中位于lib或jniLib目錄中的.so文件。
由于Android基于Linux Kernl的,也繼承了Linux中所有so相關(guān)的設(shè)計。
除了系統(tǒng)方面的原因,Android開發(fā)者還要知道以下幾點:
so機制讓開發(fā)者最大化利用已有的C和C++代碼,達到重用的效果,利用軟件世界積累了幾十年的優(yōu)秀代碼。
so是二進制,沒有解釋編譯的開消,用so實現(xiàn)的功能比純java實現(xiàn)的功能要快。
so內(nèi)存分配不受Dalivik/ART的單個應(yīng)用限制,減少OOM。
將SO文件直接放到libs/armeabi下,然后代碼中System.loadLibrary("xxx");再publicnativestaticintxxx_xxx_xxx();接下來就可以直接調(diào)用xxx_xxx_xxx()方法;
2.第二種方案,創(chuàng)建自己的SO文件,在自己的SO文件里調(diào)用第三方SO,再在程序中調(diào)用自己的SO,這種比較復(fù)雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件并實現(xiàn)相應(yīng)方法,最后用androidNDK開發(fā)包中的ndk-build腳本生成對應(yīng)的.so共享庫;求解:
網(wǎng)上說的第二種方案,是自己引用so庫,最后聲稱JAR
------解決方案--------------------------------------------------------
首先要看這個SO是不是JNI規(guī)范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調(diào)用。如果答案是否定的,你只能選第二個方案。
如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。
一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調(diào)用文件。
1、這個要看這個SO是不是符合JNI調(diào)用的規(guī)范。還要看你自己的意愿。
2、因為第二種方法最靈活,各種情況都可以實現(xiàn)。3、可以------解決方案--------------------------------------------------------
看能不能直接從JAVA調(diào)用的最簡單的方法就是看SO里的函數(shù)名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數(shù)名和JAVA函數(shù)名的轉(zhuǎn)換規(guī)則,或者向SO提供方索要;
不是的話就選第二種方案吧。
By;黎約天罰BEY
android掉用c的so包就是通過jni
,
應(yīng)該給你的jar包就是用來調(diào)用so包的
。不會讓你直接掉so包的放心。so包一般都是為了保證核心代碼不被反編譯
,另外就是效率高才會用,或者就是開發(fā)游戲
。
他們說夠用應(yīng)該是jar包已經(jīng)和so包的jni調(diào)用接口都調(diào)好了
,
你用jar包就行了
分享名稱:android調(diào)用so,android調(diào)用so里面的函數(shù)
URL標題:http://chinadenli.net/article36/dsiddpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、商城網(wǎng)站、建站公司、網(wǎng)站收錄、企業(yè)建站、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)