soandroid的簡單介紹

如何加載so文件 android

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 系統(tǒng)的so庫

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 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庫

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 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)

小程序開發(fā)