android找不到so文件
㈠ 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,已測可用。
祝你成功!
㈡ 如何載入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;
}
㈢ 安卓手機如何打開.so文件
安卓手機無法直接打開.so文件。
.so文件是Linux和Unix系統中的共享庫文件,類似於Windows系統中的.dll文件。在Android系統中,.so文件通常用於存儲編譯後的C/C++代碼,以供Java或Kotlin等語言通過JNI(Java Native Interface)調用。這些文件是二進制格式,因此無法直接在安卓手機上打開查看或編輯。
要在安卓手機上使用.so文件,你需要將其嵌入到你的Android應用程序中。這通常涉及到在Android項目的構建腳本(如build.gradle)中配置NDK(Native Development Kit)編譯選項,以便在編譯應用程序時包含.so文件。這樣,當應用程序在安卓設備上運行時,它可以載入並使用這些.so文件中的本地代碼。
需要注意的是,直接在安卓設備上查看或編輯.so文件是不可能的,因為它們是以二進制形式編譯的,而不是以人類可讀的文本形式存儲的。如果你需要查看或編輯這些代碼,你需要在開發環境中使用相應的工具,如C/C++編譯器和調試器,來查看和編輯源代碼,然後重新編譯生成.so文件。
綜上所述,安卓手機無法直接打開.so文件,但你可以通過將其嵌入到你的Android應用程序中來使用它們。如果你需要查看或編輯這些代碼,你需要在開發環境中使用相應的工具來操作源代碼。
㈣ android應用.so文件路徑
.so文件是自動生成的,必須放在libs/armeabi目錄下(不然程序絕對找不到),注意,現在一般都是libs目錄了吧。
㈤ android studio JNI開發時 編譯成功 但是沒有生成.so文件 什麼原因
(1)老版本,方法如下:taskNativeLibs(type:Copy){from(newFile(project(':MyProject').buildDir,'native-libs')){include'**/*.so'}intonewFile(buildDir,'native-libs')}tasks.withType(Compile){compileTask->compileTask.dependsOnNativeLibs}clean.dependsOn'cleanCopyNativeLibs'tasks.withType(com.android.build.gradle.PackageApplicationTask){pkgTask->pkgTask.jniDirnewFile(buildDir,'native-libs')}(2)新版本三種方法:(2.1)打包前先生成.Jar文件後自動解包到apk文件tasknativeLibsToJar(type:Zip,description:''){destinationDirfile("$buildDir/native-libs")baseName'native-libs'extension'jar'fromfileTree(dir:'libs',include:'**/*.so')into'lib/'}tasks.withType(Compile){compileTask->compileTask.dependsOn(nativeLibsToJar)}下面一句話就是打包生成目錄(build\native-libs)中的.jar文件compilefileTree(dir:"$buildDir/native-libs",include:'native-libs.jar')(2.2)手動生成.Jar文件後自動解包到apk文件這個方式需要自己手動進行.SO文件壓縮,具體步驟為:將所有需要使用的.so文件壓縮為.zip文件(zip中的文件目錄結構為:lib/armeabi/*.so)然後把zip文件後綴改為.Jar然後放到libs生成apk就ok默認就是自動打包所有.Jar文件:dependencies{compilefileTree(dir:'libs',include:'*.jar')}(2.3)這也就是現在正在使用的方式(推薦),其實無非就是把.SO文件打包到APK的lib文件夾中,假如仔細閱讀了Gradle的使用方法,自然就知道其實Gradle官方在新版已經自動實現了打包.SO文件的.很簡單級就是在配置的android節點下加入下面的內容就ok:sourceSets{main{jniLibs.srcDirs=['libs']}}其他地方無需修改,整個項目的配置文件如下:applyplugin:'android'android{"19.0.0"defaultConfig{"1.0"}buildTypes{release{('proguard-android.txt'),'proguard-rules.txt'}}sourceSets{main{jniLibs.srcDirs=['libs']}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])}
㈥ android studio 怎麼添加.so文件
android studio中添加.so文件的方法如下:
在文件夾src/main中添加一個名為jniLibs的文件夾,並把.so文件復制到該文件夾中,如圖所示: