android中加載so文件:
創(chuàng)新互聯(lián)公司是一家專業(yè)提供海陵企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為海陵眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
在Android中調(diào)用動態(tài)庫文件(*.so)都是通過jni的方式,而且往往在apk或jar包中調(diào)用so文件時,都要將對應(yīng)so文件打包進(jìn)apk或jar包,工程目錄下圖:
Android中加載so文件的提供的API:
void System.load(String pathName);
說明:
1、pathName:文件名+文件路勁;
2、該方法調(diào)用成功后so文件中的導(dǎo)出函數(shù)都將插入的系統(tǒng)提供的一個映射表(類型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()) {?
// 下載遠(yuǎn)程驅(qū)動文件?
Log.v(TAG, inFile.getAbsolutePath() + " is not fond!");?
return 1;?
}?
FileInputStream fis = new FileInputStream(inFile);
File dir = context.getDir("libs", Context.MODE_PRIVATE);?
// 獲取驅(qū)動文件輸出流?
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]);
// 字節(jié)數(shù)組輸出流,寫入到內(nèi)存中(ram)?
ByteArrayOutputStream baos = new ByteArrayOutputStream();?
byte[] buffer = new byte[1024];?
int len = -1;?
while ((len = fis.read(buffer)) != -1) {?
baos.write(buffer, 0, len);?
}?
// 從內(nèi)存到寫入到具體文件?
fos.write(baos.toByteArray());?
// 關(guān)閉文件流?
baos.close();?
fos.close();?
}?
fis.close();?
Log.v(TAG, "### System.load start");?
// 加載外設(shè)驅(qū)動?
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 ndk調(diào)用第三方的so庫文件的步驟如下:
1.將SO文件直接放到libs/armeabi下,然后代碼中System.loadLibrary("xxx");再public native static int xxx_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)方法,最后用android NDK開發(fā)包中的ndk-build腳本生成對應(yīng)的.so共享庫;
您好,您可能指的是Android OS。
Android OS其實就是安卓操作系統(tǒng)的名字。Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機和平板電腦,由Google公司和開放手機聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。尚未有統(tǒng)一中文名稱,中國大陸地區(qū)較多人使用“安卓”或“安致”。Android操作系統(tǒng)最初由Andy Rubin開發(fā),主要支持手機。2005年8月由Google收購注資。2007年11月,Google與84家硬件制造商、軟件開發(fā)商及電信營運商組建開放手機聯(lián)盟共同研發(fā)改良Android系統(tǒng)。隨后Google以Apache開源許可證的授權(quán)方式,發(fā)布了Android的源代碼。第一部Android智能手機發(fā)布于2008年10月。Android逐漸擴展到平板電腦及其他領(lǐng)域上,如電視、數(shù)碼相機、游戲機等。2011年第一季度,Android在全球的市場份額首次超過塞班系統(tǒng),躍居全球第一。 2013年的第四季度,Android平臺手機的全球市場份額已經(jīng)達(dá)到78.1%。2013年09月24日谷歌開發(fā)的操作系統(tǒng)Android在迎來了5歲生日,全世界采用這款系統(tǒng)的設(shè)備數(shù)量已經(jīng)達(dá)到10億臺。
如果您確定您問的是Android SO的話,下面給出解釋。
Android SO是Android編程中用到的so類型的文件,是一個c++的函數(shù)庫,在android的JNI中,是先將相應(yīng)的C語言打包成so庫導(dǎo)入到lib文件夾中調(diào)用的。
參考:百度百科。
android項目中如何加載已有so庫方法:
1、在項目根目錄下建立文件夾libs/armeabi文件夾。
2、將so庫放入libs/armeabi文件夾注意事項:
(1)如果采用靜態(tài)注冊的方式請注意C文件中嚴(yán)格按照命名規(guī)則Java_packageName_className_method()的方式命名。
(2)在Android項目中建立同上述命名規(guī)則中packageName中相同的包名,在此包名下建立同上述命名規(guī)則中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?studio開發(fā)中,遇到過如何引入第三方so文件的問題,然而第三方官方僅僅給出了ADT環(huán)境下的集成方式。
Android studio中默認(rèn)使用的是gradle編譯方式,與ADT編輯方式不一樣,那么so文件應(yīng)當(dāng)如何引入呢?
其實很簡單。這里以集成JPUSH為例,看一下so文件如何引入到編譯環(huán)境,最終到JNI直接可以調(diào)用該so文件。
首先,在我們的Module的根目錄中建立libs目錄,將jpush集成SDK中的so文件分別拷入,截圖如下:
然后就是編寫我們的build.gradle文件。
關(guān)于so文件引入的配置很簡單,代碼配置如下:
[html]?view plain?copy?print?
task?nativeLibsToJar(type:?Zip,?description:?"create?a?jar?archive?of?the?native?libs")?{
destinationDir?file("$projectDir/libs")
baseName?"Native_Libs2"
extension?"jar"
from?fileTree(dir:?"libs",?include:?"**/*.so")
into?"lib"
}
tasks.withType(JavaCompile)?{
compileTask?-?compileTask.dependsOn(nativeLibsToJar)
}
自定義一個任務(wù),在其中指定項目所依賴的so文件的目錄,這里用了**/*.so來寫,為了省事,指定需要拷入的目錄 into "lib",那么動態(tài)運行庫就被拷入到lib目錄中。
完整的build.gradle文件如下:
[html]?view plain?copy?print?
apply?plugin:?'com.android.application'
android?{
compileSdkVersion?21
buildToolsVersion?"21.1.0"
defaultConfig?{
applicationId?"com.wujay.footerballstar"
minSdkVersion?8
targetSdkVersion?21
versionCode?1
versionName?"1.0"
}
buildTypes?{
release?{
runProguard?false
proguardFiles?getDefaultProguardFile('proguard-android.txt'),?'proguard-rules.pro'
}
}
task?nativeLibsToJar(type:?Zip,?description:?"create?a?jar?archive?of?the?native?libs")?{
destinationDir?file("$projectDir/libs")
baseName?"Native_Libs2"
extension?"jar"
from?fileTree(dir:?"libs",?include:?"**/*.so")
into?"lib"
}
tasks.withType(JavaCompile)?{
compileTask?-?compileTask.dependsOn(nativeLibsToJar)
}
}
dependencies?{
compile?fileTree(dir:?'libs',?include:?['*.jar'])
compile?'com.android.support:appcompat-v7:21.0.0'
compile?files('libs/jpush-sdk-release1.7.2.jar')
compile?files('libs/umeng_sdk.jar')
compile?files('libs/libammsdk.jar')
}
本文題目:soandroid的簡單介紹
文章源于:http://muchs.cn/article34/phigpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計公司、響應(yīng)式網(wǎng)站、App開發(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)