❶ android so文件有什麼用
android中用到的so文件是一個c++的函數庫,在android的JNI中,是先將相應的C語言打包成so庫導入到lib文件夾中調用的。
❷ 如何載入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;
}
❸ 如何獲取android 系統的so庫
android ndk調用第三方的so庫文件的步驟如下:
1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法;
2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用android NDK開發包中的ndk-build腳本生成對應的.so共享庫;
❹ android 怎麼使用.so庫里文件
1,在項目根目錄下建立文件夾libs/armeabi文件夾
2,將so庫放入libs/armeabi文件夾注意事項:
1,如果採用靜態注冊的方式請注意C文件中嚴格按照命名規則Java_packageName_className_method()的方式命名
2,在Android項目中建立同上述命名規則中packageName中相同的包名,在此包名下建立同上述命名規則中className相同的類名
3,在className聲明native方法
4,程序中載入so庫System.loadLibrary(data/data/xxx.xxx.xxx/lib/xx.so)或者System.loadLibrary(xx),例如:System.loadLibrary(data/data/com.dtBank.app.service/lib/libjnixcld.so);
❺ 關於android軟體中的so文件!
*.so文件是linux平台下的動態鏈接庫,反編譯動態鏈接庫參見windows下*.dll文件的反編譯,類似的
Linux:是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。
Linux操作系統誕生於1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU 工程各種工具和資料庫的操作系統。
動態鏈接庫:英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。DLL 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。
DLL文件又稱「應用程序拓展」,是軟體文件類型。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可使用多個DLL文件,一個DLL文件也可能被不同的應用程序使用,這樣的DLL文件被稱為共享DLL文件。[1]
❻ 如何簡單修改Android的so文件
有的時候需要定製Android默認藍牙設備名稱,當然在我們有源碼的情況下自然是很好處理,但如果沒有源碼呢?這時候就需要修改so文件了。
藍牙默認設備名稱的修改在:
frameworks\base\core\jni\Android_bluetooth_common.h
主要就是修改BTMTK_ANDROID_DEFAULT_LOCAL_NAME的值
#define BTMTK_ANDROID_DEFAULT_LOCAL_NAME "ANDROID BT"
查看相關mk文件可以知道,該文件最終編譯到了libandroid_runtime.so中,所以我們直接找到編譯好的libandroid_runtime.so
工具
WinHex
該工具是一款非常不錯的 16 進制編輯器,得到 ZDNetSoftwareLibrary 五星級最高評價,擁有強大的系統效用。
(PS:按F3查找下一個)
方法
將libandroid_runtime.so載入到WinHex中,然後全文搜索ANDROID BT,理論上只會有一處,當然也不能排除有多處,最終定位到代碼如下:
00684736 | 73 31 35 00 48 49 4B 65 20 37 31 36 00 5B 47 41 | s15 ANDROID BT
在WinHex中我們可以搜到僅有一處定義,因此直接修改為自己想定義的名稱,完成之後點擊保存,重新push到設備中,重啟設備即可生效
❼ android so文件是什麼
so文件是unix的動態連接庫,是二進制文件,作用相當於windows下的.dll文件。
補充:
在Android中調用動態庫文件(*.so)都是通過jni的方式。
Android中載入so文件的提供的API:
void System.load(String pathName);
說明:pathName:文件名+文件路徑;
❽ 請教Android內置應用Browser編譯成APK的問題
在Eclipse創建一個Android工程,把android.webkit目錄下的Java代碼拷貝過來;
將/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/webkit下面的EventLogTags.java也拷貝到自己的工程;
因為android.webkit下的類會使用SDK中非公開的API,我們需要解決編譯錯誤:
/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates/classes.jar
創建一個User Library,並且勾選System Library的選項;
加入以下Jar包:
在Java Build Path/Order and Export把創建的庫放在最前面;
因為在我們應用中的android.webkit包跟SDK中的重名,所以我們需要更改包名,可以改成android.webkit2;
我們需要重新編譯libchromium_net.so和libwebcore.so,並且使用另外的名字,並且把其代碼中使用的android/webkit/ JNI路徑改成android/webkit2/保證JNI的正確性:
在/home/roger/a41/external/chromium下面,把所有源文件的android/webkit/路徑改成android/webkit2/;
打開/home/roger/a41/external/chromium/Android.mk,修改庫名為libchromium_net2,並且加多一行「LOCAL_MODULE_TAGS := optional「,具體內容見後;
重新編譯chromium_net,得到libchromium_net2.so;
在/home/roger/a41/external/webkit/Source/WebKit/android下面,把所有源文件的android/webkit/路徑改成android/webkit2/;
打開/home/roger/a41/external/webkit/Android.mk,將庫名改成libwebcore2.so,並且加多一行「LOCAL_MODULE_TAGS := optional「(需要修改兩個地方,靜態庫編譯和動態庫編譯),另外還需要把導入庫libchromium_net改成libchromium_net2,具體內容見後;
重新編譯webcore,得到libwebcore2.so;
接下來我們可以把修改後的libwebcore2.so和libchromium_net2.so push到手機的rom裡面,假設路徑是/data/local(如果沒有寫許可權,用Root Explorer修改);
然後我們需要修改Java的代碼,讓它去載入我們自己的庫,修改的地方位於JniUtil.java和WebViewCore.java,具體內容見後(載入順序需要改變,先載入libchromium_net2.so再載入libwebcore2.so);
最後加上我們自己的Test Shell的代碼,運行就OK了,如果只修改了C++的代碼,重編譯後再Push到手機,然後重新運行Test Shell就可以馬上生效,Java的代碼可以在Eclipse裡面很方便的調試,C++的代碼理論上也可以通過GDB進行調試;
❾ Android SO什麼意思
android 中.so即動態鏈接庫。
.SO文件也是ELF格式文件,共享庫(動態庫),類似於DLL。節約資源,加快速度,代碼升級簡化。
動態鏈接庫(Dynamic Link Library 或者 Dynamic-link Library,縮寫為 DLL),是微軟公司在微軟Windows操作系統中,實現共享函數庫概念的一種方式。這些庫函數的擴展名是 」.dll"、".ocx"(包含ActiveX控制的庫)或者 ".drv"(舊式的系統驅動程序)。
❿ android so文件怎麼用
相信很多朋友在使用Androidstudio開發中,遇到過如何引入第三方so文件的問題,然而第三方官方僅僅給出了ADT環境下的集成方式。
Android studio中默認使用的是gradle編譯方式,與ADT編輯方式不一樣,那麼so文件應當如何引入呢?
其實很簡單。這里以集成JPUSH為例,看一下so文件如何引入到編譯環境,最終到JNI直接可以調用該so文件。
首先,在我們的Mole的根目錄中建立libs目錄,將jpush集成SDK中的so文件分別拷入,截圖如下:
然後就是編寫我們的build.gradle文件。
關於so文件引入的配置很簡單,代碼配置如下:
[html]view plainprint?
tasknativeLibsToJar(type:Zip,description:""){
destinationDirfile("$projectDir/libs")
baseName"Native_Libs2"
extension"jar"
fromfileTree(dir:"libs",include:"**/*.so")
into"lib"
}
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOn(nativeLibsToJar)
}
自定義一個任務,在其中指定項目所依賴的so文件的目錄,這里用了**/*.so來寫,為了省事,指定需要拷入的目錄 into "lib",那麼動態運行庫就被拷入到lib目錄中。
完整的build.gradle文件如下:
[html]view plainprint?
applyplugin:'com.android.application'
android{
compileSdkVersion21
buildToolsVersion"21.1.0"
defaultConfig{
applicationId"com.wujay.footerballstar"
minSdkVersion8
targetSdkVersion21
versionCode1
versionName"1.0"
}
buildTypes{
release{
runProguardfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
tasknativeLibsToJar(type:Zip,description:""){
destinationDirfile("$projectDir/libs")
baseName"Native_Libs2"
extension"jar"
fromfileTree(dir:"libs",include:"**/*.so")
into"lib"
}
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOn(nativeLibsToJar)
}
}
dependencies{
compilefileTree(dir:'libs',include:['*.jar'])
compile'com.android.support:appcompat-v7:21.0.0'
compilefiles('libs/jpush-sdk-release1.7.2.jar')
compilefiles('libs/umeng_sdk.jar')
compilefiles('libs/libammsdk.jar')
}