androidso載入失敗
Ⅰ Android Studio導入.so文件無法識別載入怎麼回事導致app老是閃退
說明so有問題,或者so沒有對應你手機的cpu架構的。
Ⅱ android 5.0替換so文件後讀取失敗
首先,這里你說的不是很清楚,我就大致回答一下。
一般,so是放在/data/data/packagename/lib下面,嗯,這是表象,在/data/data/packagename/目錄下執行ls -l,會發現lib只是一個連接,lib -> /data/app-lib/packagename-n,就是你的so其實是放在/data/app-lib/packagename-n下的,System.loadLibrary(name)查找應用so一般就是在/data/app-lib下。你如果想修改so,必須有/data/app-lib/操作許可權然後更改so的相應許可權,比如使用root許可權可以操作,這里還需要防止系統重啟時重新替換so,嗯,它有存你的apk,必要時還原相關文件。如果你新建/data/data/packagename/lib目錄,但是System.loadLibrary(name)尋找so的目錄不包含你這個目錄,所以無法找到so。
那其實還有另一種做法,就是利用sd卡的操作許可權,把so放到sd卡上,更改許可權為7XX,然後使用System.load(path)這個方法載入指定的so,已測可用。
祝你成功!
Ⅲ android 調取so庫出現錯誤,大神,怎麼解決
首先你要確認你的so庫文件名和你載入時指定的是否一致,另外SO庫本身要沒有問題
Ⅳ android studio so文件載入問題找不到
ndroid也是基於linux操作系統的,他查找載入動態庫的邏輯和linux差不多,流程是比較復雜的。具體的內容太多,推薦看一下這篇文章 :一文讀懂Linux下動態鏈接庫版本管理及查找載入方式,可能會對你有幫助
Ⅳ Android Studio 為什麼老是載入不起.so文件
Android Studio剛發布,相信很多朋友和我一樣,開始嘗試用其開發項目,但新東西總會遇到這樣或那樣的問題,其中令我頭的就是引入第三方的jar包無法編譯的問題,因為是新東西,相關的信息都比較少,解決問題令我花費了相當長的時間,為了避免各位同仁再走彎路,在此將解決步驟列出來。
1、將jar包放入項目里的libs文件夾中。
2、在project選中jar包點擊右鍵"Add as library"。
3、這兩步是網上比較容易找到的,但此時項目仍然是無法正常編譯的,這時需要在項目的build.gradle文件里的dependencies節加入 dependencies
{
compile files('libs/android-support-v4.jar')
compile files('libs/xxxx.jar')
}
4、此時項目正常編譯並運行了,但當你的代碼中真正創建了引用jar里的類實例時,有可能系統會拋出異常NoClassDefFoundError,這個時候可以按以下步驟操作:
進入命令提示符窗口。
定位到項目的根目錄,即build.gradle所在的目錄。
運行 "{android studio 安裝目錄}\sdk\tools\templates\gradle\wrapper\gradlew.bat" clean
重新編譯運行項目
通過以上操作,應該可以解決問題。
Ⅵ android在用System.load()載入so文件時出現已經載入到內存錯誤,如何解決
這要看你在c++代碼里有沒有沒釋放的內存了。畢竟能成功運行一次,說明編譯沒錯誤,配置也沒錯誤。看檢察一下你的c++代碼。
Ⅶ 請教關於android linux動態庫.so的載入調用
1、 .so動態庫的生成
可使用gcc或者g++編譯器生成動態庫文件(此處以g++編譯器為例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so動態庫的動態調用介面函數說明
動態庫的調用關系可以在需要調用動態庫的程序編譯時,通過g++的-L和-l命令來指定。例如:程序test啟動時需要載入目錄/root/src/lib中的libtest_so1.so動態庫,編譯命令可照如下編寫執行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(此處,我們重點講解動態庫的動態調用的方法,關於靜態的通過g++編譯命令調用的方式不作詳細講解,具體相關內容可上網查詢)
Linux下,提供專門的一組API用於完成打開動態庫,查找符號,處理出錯,關閉動態庫等功能。
下面對這些介面函數逐一介紹(調用這些介面時,需引用頭文件#include <dlfcn.h>):
1) dlopen
函數原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必須在dlerror,dlsym和dlclose之前調用,表示要將庫裝載到內存,准備使用。如果要裝載的庫依賴於其它庫,必須首先裝載依賴庫。如果dlopen操作失敗,返回NULL值;如果庫已經被裝載過,則dlopen會返回同樣的句柄。
參數中的libname一般是庫的全路徑,這樣dlopen會直接裝載該文件;如果只是指定了庫名稱,在dlopen會按照下面的機制去搜尋:
a.根據環境變數LD_LIBRARY_PATH查找
b.根據/etc/ld.so.cache查找
c.查找依次在/lib和/usr/lib目錄查找。
flag參數表示處理未定義函數的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暫時不去處理未定義函數,先把庫裝載到內存,等用到沒定義的函數再說;RTLD_NOW表示馬上檢查是否存在未定義的函數,若存在,則dlopen以失敗告終。
2) dlerror
函數原型:char *dlerror(void);
功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤信息,返回NULL表示無錯誤。dlerror在返回錯誤信息的同時,也會清除錯誤信息。
3) dlsym
函數原型:void *dlsym(void *handle,const char *symbol);
功能描述:在dlopen之後,庫被裝載到內存。dlsym可以獲得指定函數(symbol)在內存中的位置(指針)。如果找不到指定函數,則dlsym會返回NULL值。但判斷函數是否存在最好的方法是使用dlerror函數,
4) dlclose
函數原型:int dlclose(void *);
功能描述:將已經裝載的庫句柄減一,如果句柄減至零,則該庫會被卸載。如果存在析構函數,則在dlclose之後,析構函數會被調用。
3、 普通函數的調用
此處以源碼實例說明。各源碼文件關系如下:
test_so1.h和test_so1.cpp生成test_so1.so動態庫。
test_so2.h和test_so2.cpp生成test_so2.so動態庫。
test_dl.cpp生成test_dl可執行程序,test_dl通過dlopen系列等API函數,並使用函數指針以到達動態調用不同so庫中test函數的目的。
Ⅷ 如何載入so文件 android
android中載入so文件:
在Android中調用動態庫文件(*.so)都是通過jni的方式,而且往往在apk或jar包中調用so文件時,都要將對應so文件打包進apk或jar包,工程目錄下圖:
Android中載入so文件的提供的API:
void System.load(String pathName);
說明:
1、pathName:文件名+文件路勁;
2、該方法調用成功後so文件中的導出函數都將插入的系統提供的一個映射表(類型Map);
3、具體代碼如下:
try {
String localPath = Environment.getExternalStorageDirectory() + path;
Log.v(TAG, "LazyBandingLib localPath:" + localPath);
String[] tokens = mPatterns.split(path);
if (null == tokens || tokens.length <= 0
|| tokens[tokens.length - 1] == "") {
Log.v(TAG, "非法的文件路徑!");
return -3;
}
// 開辟一個輸入流
File inFile = new File(localPath);
// 判斷需載入的文件是否存在
if (!inFile.exists()) {
// 下載遠程驅動文件
Log.v(TAG, inFile.getAbsolutePath() + " is not fond!");
return 1;
}
FileInputStream fis = new FileInputStream(inFile);
File dir = context.getDir("libs", Context.MODE_PRIVATE);
// 獲取驅動文件輸出流
File soFile = new File(dir, tokens[tokens.length - 1]);
if (!soFile.exists()) {
Log.v(TAG, "### " + soFile.getAbsolutePath() + " is not exists");
FileOutputStream fos = new FileOutputStream(soFile);
Log.v(TAG, "FileOutputStream:" + fos.toString() + ",tokens:"
+ tokens[tokens.length - 1]);
// 位元組數組輸出流,寫入到內存中(ram)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
// 從內存到寫入到具體文件
fos.write(baos.toByteArray());
// 關閉文件流
baos.close();
fos.close();
}
fis.close();
Log.v(TAG, "### System.load start");
// 載入外設驅動
System.load(soFile.getAbsolutePath());
Log.v(TAG, "### System.load End");
return 0;
} catch (Exception e) {
Log.v(TAG, "Exception " + e.getMessage());
e.printStackTrace();
return -1;
}
Ⅸ android5.0手機上載入高德地圖報錯原因是so文件太多,刪掉其他so文件只留高德so文件能就沒事
樓主好!您的問題較專業,非常抱歉小德幫不上忙,麻煩您到高德開發者社區http://lbsbbs.amap.com/portal.php提問,並說明您的平台是iOS,Android,WP~或者請您登錄高德LBS開放平台(http://lbs.amap.com/)點擊右下角在線咨詢,會有技術來解答您的問題哦。