當前位置:首頁 » 安卓系統 » android調用第三方庫

android調用第三方庫

發布時間: 2022-07-26 19:07:24

1. Android NDK調用第三方的庫,對庫有限制嗎

問題描述: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/下,這也是系統載入動態庫時搜索的路徑。

2. 如何在Android NDK中調用第三方庫文件

1.在project/jni目錄下創建prebuilt子目錄(目錄名可自定義).

2.將第三方.so放到prebuilt中,並創建Android.mk, 內容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := xxx

LOCAL_SRC_FILES := libxxx.so

include $(PREBUILT_SHARED_LIBRARY)

3.在project/jni/Android.mk中加入

LOCAL_SHARED_LIBRARIES := xxx

4.在project/jni/android.mk的最後加入

include $(LOCAL_PATH)/prebuilt/Android.mk

5.運行cygwin, 到project目錄下, 運行$NDK/ndk-build

3. 用android studio引入第三方so庫,怎麼調不了方法

之前一直沒有做過第三方的推送消息,這次公司要求採用國內極光第三方推送服務,由於項目還在原型圖構思中,因而還可以花點時間看看這方面的東西。

看了下相關的DEMO,挺簡單的,加點許可權,把相關的廣播以及服務注冊一下就好了,然後在application中初始化一下,就解決了。可偏偏這么簡單的幾步,確花了我一點時間去調通。

過濾了相關的log如下
06-21 15:00:53.080 3006-3006/com.soo.jchatdemo E/JPush: [JPushInterface] System.loadLibrary::jpush215java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.soo.jchatdemo-2/base.apk"],nativeLibraryDirectories=[/system/lib, /vendor/lib, system/vendor/lib, system/vendor/lib/egl, system/lib/hw]]] couldn't find "libjpush215.so"

06-21 15:00:53.100 3006-3006/com.soo.jchatdemo W/System.err: at cn.jpush.android.api.JPushInterface.init(Unknown Source)

06-21 15:00:53.100 3006-3006/com.soo.jchatdemo E/JPush: [JPushGlobal] Get sdk version fail![獲取sdk版本失敗!]

06-21 15:00:53.100 3006-3006/com.soo.jchatdemo W/System.err: at cn.jpush.android.api.JPushInterface.init(Unknown Source)

06-21 15:00:53.100 3006-3006/com.soo.jchatdemo E/JPush: [JPushGlobal] JPush .so file do not match JPush .jar file in the project, Failed to init JPush


明顯告訴我們,目前缺少了libjpush215.so文件。奇怪的是這so庫已經在我們項目的libs中,之前在eclipse中這樣完全能跑起來的。
問題是Android
Studio目前在打包的時候並沒有在libs中復制SO庫到項目中。因此我們需要在build.gradle中告訴AS執行復制so庫文件。
android {
...
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
}

然後重新Sync Now一下,整個世界都明亮了

4. android 開發怎麼使用第三方sdk

  • 步驟

    1. 下載好第三方的jar包



    2. 然後所導入的第三方SDK就可以用了

5. android瀏覽器怎麼調用第三方的動態庫

需要NDK開發吧 可以調用第三方的 靜態庫 和 共享庫, 不過這些庫都要使用 NDK的交叉編譯環境 進行交叉編譯後才能在Android上調用;另外 Android 上是不能調用 x86 平台 編譯的第三方庫的

6. android studio2.0怎麼導入第三方類庫

下面分兩種情況介紹一下如何導入第三方類庫。1、對於jar的類庫,非常簡單,只要在項目根目錄下新建一個libs目錄,然後把jar復制進去,在jar上點擊右鍵,選擇Addaslibrary,即可完成依賴的添加。2、對於github等網站上下載的源碼類庫,是無法通過這種方式添加的。首先把gitclone下來的整個文件夾放入項目根目錄下,這里以我自己的開發包為例,我的開發包名字是ShunixDevKit,裡面有一個lib目錄才是真正的類庫,那麼我們要做的就是手動在settings.gradle裡面添加:include':ShunixDevKit:lib'注意,gradle使用:作為路徑分隔符。這樣AndroidStudio就知道了我們的類庫放在哪裡,當然這樣還是不夠的,要讓項目能使用類庫,我們還需要添加這個類庫作為項目的依賴,選擇File->ProjectStructure,然後選中主mole的名稱,點擊dependencies,添加:ShunixDevKit:lib就可以了,gradle的build就能成功。以上就是添加第三方類庫作為依賴的過程。這里需要注意一下的地方就是,導入的類庫根目錄下的gradlew文件一定要可執行,否則AndroidStudio會提示錯誤,而且根據錯誤信息很難找出來這個錯誤,我自己因為這個搞了很久,希望對大家有幫助。

7. 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/下,這也是系統載入動態庫時搜索的路徑。

8. android studio怎樣導入第三方庫 步驟

Android Studio導入第三方庫的方法我個人知曉的有三種:

一、Gradle抓取

二、libs導入

三、源碼導入

一、Gradle抓取

  1. Gradle抓取的方法最為簡單,只需在Project->app文件夾下的build.gradle文件中添加依賴:

  2. build.gradle文件夾所在位置

  3. 在builde.gradle文件中制定位置添加代碼

    compile 'cn.finalteam:galleryfinal:1.4.8.7'

    然後同步一下工程即可。

二、libs導入

  1. 將從網上下載對應的第三方庫的jar包放入Project->app文件夾下的libs文件夾:

  2. libs文件夾所在位置

  3. 然後在單擊jar包右鍵,選擇「Add as library...」可實現導入;或者在我們上述的build.gradle文件中添加依賴:

    ompile files('libs/galleryfinal.jar')

三、源碼導入

  1. 選擇Android Studio菜單欄File->New->import Mole...,彈出窗口選擇Mole的路徑:

  2. 找到下載好的第三方庫,找到其中用的Mole:

  3. 選擇galleryfinal,點擊OK。

  4. 同步一下工程,會出現這樣的報錯信息:

  5. 點擊「Open File」,找到錯誤的地方:

  6. 導入庫的build.gradle位置

  7. 將「project_version」修改為版本名稱,如"1.0":

  8. 再次同步工程,又會出現報錯信息:

  9. 原因是找不到bintray.gradle文件,查找了以下網上的解決方法是刪除或注釋掉第三方庫的build.gradle文件中的:apply from: "../bintray.gradle"

  10. 然後我們繼續同步工程,會發現Android Studio一直停留在:

  11. 這是因為第三方庫需要用到相應的jar文件或gradle文件或arr文件,如果覺得這個過程太慢,可以考慮以下方法:

    翻牆

    手動下載相應文件,參考:聽說你Android Studio更新Gradle很慢

    放棄治療,等待下載完畢

熱點內容
怎麼把安卓手機視頻導入蘋果ipad 發布:2025-01-21 16:10:43 瀏覽:997
c語言實現編譯器 發布:2025-01-21 16:03:19 瀏覽:392
做解壓橡皮 發布:2025-01-21 15:03:06 瀏覽:991
雙系統win訪問mac 發布:2025-01-21 14:53:52 瀏覽:485
安卓車機系統如何安裝carplay 發布:2025-01-21 14:52:24 瀏覽:590
sql操作手冊 發布:2025-01-21 14:46:08 瀏覽:312
青橙腳本 發布:2025-01-21 14:44:05 瀏覽:219
東風本田crv時尚版是什麼配置 發布:2025-01-21 14:20:04 瀏覽:219
安卓如何多開軟體每個機型不一樣 發布:2025-01-21 14:15:29 瀏覽:501
iis配置php5 發布:2025-01-21 14:08:19 瀏覽:274