導航:首頁 > 操作系統 > androidso庫使用

androidso庫使用

發布時間:2022-07-14 11:00:42

A. 請教關於android linux動態庫.so的載入調用

1.在使用第三方的.so庫做android開發,發現僅僅放到AndroidProject/libs/armeabi/libminivenus.so這個位置,使用System.loadLibrary載入起來可以正常使用。
2.庫的名字必須是libminivenus.so,不可以改名字。也不可以使用System.load從其他地方載入(非SD卡)。如果將庫的名字或者載入位置改動,調用的jni介面就返回錯誤。
3.libminivenus.so中確實有libminivenus的欄位,將庫的名字與該欄位一起修改結果無效。

B. android studio怎麼使用so庫

Android studio中導入so的兩種方法:

1、將so文件放在libs目錄下,然後在app的build.gradle中加入如下配置

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
整個配置文件如下:

android {
compileSdkVersion 23
buildToolsVersion '19.1.0'

defaultConfig {
applicationId "com.hehe.itlms"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled true//是否混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}

2、將所有需要使用的.so文件壓縮為.zip文件(zip中的文件目錄結構為:
lib/armeabi/*.so)注意,一定要是這樣的路徑,lib不要寫成libs啊!然後將這個.zip文件重命名為armeabi.jar文件(我用的是so.jar),將該jar包添加到項目的libs文件下,然後Add
isLibrary。

最後的目錄結構
libs
^---|xxx.jar
^---|armeabi.jar
^---|lib
^---|armeabi
^---|xxx.so

C. Android怎麼調用第三方SO動態鏈接庫

已了解解決方案: 1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再publicnativestaticintxxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法; 2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用androidNDK開發包中的ndk-build腳本生成對應的.so共享庫;求解: 網上說的第二種方案,是自己引用so庫,最後聲稱JAR ------解決方案-------------------------------------------------------- 首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。 如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。 一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。 1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。 2、因為第二種方法最靈活,各種情況都可以實現。3、可以------解決方案-------------------------------------------------------- 看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的 是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要; 不是的話就選第二種方案吧。

D. 如何在64位安卓系統中使用32位SO庫

關鍵點:
JAVA編譯不分32bit和64bit(APK,JAR)
可執行文件,默認編譯64位
動態庫和靜態庫,默認同時編譯32bit和64bit版本
通過LOCAL_MULTILIB可以指定特定模塊編譯32bit或64bit或都編譯
JAVA載入JNI庫(so文件)的規則:
如果APP需要載入的所有so都是32bit,則使用32bit方式載入so庫;如果APP需要載入的so庫中只要有一個so是64bit的,則必須以64bit方式載入so庫;不能同時載入32bit和64bit的so庫。
實際工程中,我們通常會遇到下面這樣的場景:
A. APK有源碼,SO庫有源碼 - 應用及so庫我們都能自己編譯出來
B. APK有源碼,SO庫沒有源碼 - 我們開發的應用使用了第三方的so庫,如ScanService
C. APK和SO庫都沒有源碼 - 預置第三方的應用(應用中包括so庫)
對於場景A:
只要我們編譯默認對應的APP和SO庫(32bit+64bit)即可。
此種場景最為普通,本文不做詳細講解。
對於場景B:
如果APK需要載入的庫裡面有64bit的,則需要全部的庫都使用64bit。
如果APK調用的第三方so庫中有32bit的,則:要麼讓第三方提供64bit版本的so庫,要麼強制使所以的so庫都使用32bit版本。
對於場景C:
使用特定的預置規則即可。

E. android studio怎麼使用so文件

首先,在我們的Mole的根目錄中建立libs目錄,將jpush集成SDK中的so文件分別拷入,截圖如下:


然後就是編寫我們的build.gradle文件。

關於so文件引入的配置很簡單,代碼配置如下:

[html] view plain print?在CODE上查看代碼片派生到我的代碼片

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)

}


自定義一個任務,在其中指定項目所依賴的so文件的目錄,這里用了**/*.so來寫,為了省事,指定需要拷入的目錄 into "lib",那麼動態運行庫就被拷入到lib目錄中。

F. android ndk 怎樣調用第三方的so庫文件

問題描述:Android如何調用第三方SO庫;
已知條件:SO庫為Android版本連接庫(*.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共享庫;
求解:
1.上面兩種方案是否可行?不可行的話存在什麼問題?
2.兩種方案有什麼區別?為什麼網上大部都是用的第二種方案?
3.只有一個*.so文件,並提供了詳細的介面說明,是否可在ANDROID中使用它?

首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。

如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。

一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。

1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。
2、因為第二種方法最靈活,各種情況都可以實現。
3、可以

看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要;
不是的話就選第二種方案吧。

1、檢查所需文件是否齊全
使用第三方動態庫,應該至少有2個文件,一個是動態庫(.so),另一個是包含
動態庫API聲明的頭文件(.h)
2、封裝原動態庫
原動態庫文件不包含jni介面需要的信息,所以我們需要對其進行封裝,所以我
們的需求是:將libadd.so 裡面的API封裝成帶jni介面的動態
3、編寫庫的封裝函數libaddjni.c
根據前面生成的com_android_libjni_LibJavaHeader.h 文件,編寫libaddjni.c,用
來生成libaddjni.so

Android中集成第三方軟體包(.jar, .so)

Android中可能會用到第三方的軟體包,這包括Java包.jar和Native包.so。jar包既可通過Eclipse開發環境集成,也可通過編譯源碼集成,看你的工作環境。

假定自己開發的程序為MyMaps,需要用到BaiMaps的庫,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。

一、Eclipse中集成第三方jar包及.so動態庫

MyMaps工程下創建目錄libs以及libs/armeabi,把mapapi.jar放在的libs/目錄下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。

Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步驟:

1. 右擊工程,選擇Properties;
2. Java Build Path,選擇Libraries;
3. Libraries頁面點擊右面按鈕「Add Library…」;
4. 選擇「User Library」,點擊「Next」;
5. 點擊「User Libraries」按鈕;
6. 在彈出界面中,點擊「New…」;
7. 輸入「User library name」,點擊「OK」確認;
8. 返回之後,選擇剛剛創建的User library,右面點擊「AddJARs」;
9. 選擇MyMaps/libs/下的mapapi.jar;
10. 確認,返回。

這樣,編譯之後,該jar包就會被打進MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
程序運行過程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,載入動態庫時系統會從程序的該lib/目錄下查找.so庫。

二、源碼中集成第三方集成jar包及.so動態庫

Android源碼中MyMaps放在packages/apps下。MyMaps下創建目錄libs以及libs/armeabi,並把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

2.1 修改Android.mk文件

Android.mk文件如下:

[plain] view plain
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := libmapapi

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := MyMaps

include $(BUILD_PACKAGE)

##################################################
include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jar
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)

# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))

1 集成jar包
LOCAL_STATIC_JAVA_LIBRARIES取jar庫的別名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar庫的規則,格式:別名:jar文件路徑。注意:別名一定要與LOCAL_STATIC_JAVA_LIBRARIES里所取的別名一致,且不含.jar;jar文件路徑一定要是真實的存放第三方jar包的路徑。
編譯用BUILD_MULTI_PREBUILT。
2 集成.so動態庫
LOCAL_PREBUILT_LIBS指定prebuilt so的規則,格式:別名:so文件路徑。注意:別名一般不可改變,特別是第三方jar包使用.so庫的情況,且不含.so;so文件路徑一定要是真實的存放第三方so文件的路徑。
編譯拷貝用BUILD_MULTI_PREBUILT。

2.2 加入到GRANDFATHERED_USER_MODULES

在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中

[plain] view plain
GRANDFATHERED_USER_MODULES += \
… \
libBMapApiEngine_v1_3_1

user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推薦修改$(TARGET_DEVICE_DIR)下的。

2.3 編譯結果

MyMaps.apk編譯生成在out/target/proct/<YourProct>/system/app/下;
libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,這也是系統載入動態庫時搜索的路徑。

G. 關於Android開發中Java對於.so庫的調用

android掉用c的so包就是通過jni

應該給你的jar包就是用來調用so包的
。不會讓你直接掉so包的放心。so包一般都是為了保證核心代碼不被反編譯
,另外就是效率高才會用,或者就是開發游戲

他們說夠用應該是jar包已經和so包的jni調用介面都調好了

你用jar包就行了

H. android rom /system/lib/ 中好多的.so庫,每個.so具體是干什麼用

主要是一些用來調用硬體層面的c語言編寫的代碼,很多功能,在java層面是無法調用的,必須藉助c語言來實現。

I. 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')

}

閱讀全文

與androidso庫使用相關的資料

熱點內容
廣播PDF 瀏覽:216
單片機編程300例匯編百度 瀏覽:33
騰訊雲連接不上伺服器 瀏覽:221
不能用來表示演算法的是 瀏覽:859
6軸機器人演算法 瀏覽:890
手機主題照片在哪個文件夾 瀏覽:294
安卓手機後期用什麼軟體調色 瀏覽:628
cad修改快捷鍵的命令 瀏覽:242
好錢包app怎麼登錄不了 瀏覽:859
樹莓派都用python不用c 瀏覽:757
access文件夾樹的構造 瀏覽:662
安卓多指操作怎麼設置 瀏覽:658
linux樹形目錄 瀏覽:727
平方根的簡單演算法 瀏覽:898
千牛訂單頁面信息加密取消 瀏覽:558
單片機自製紅外遙控燈 瀏覽:719
伺服器最小配置怎麼弄 瀏覽:853
ibm伺服器硬體如何升級 瀏覽:923
全球程序員節點贊 瀏覽:986
php函數傳遞數組 瀏覽:632