1. 程式人生 > >Android如何呼叫第三方SO庫

Android如何呼叫第三方SO庫

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

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

一、Eclipse中整合第三方jar包及.so動態庫

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

Eclipse中把第三方jar包baidumapapi.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/下的baidumapapi.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,並把baidumapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

2.1 修改Android.mk檔案

Android.mk檔案如下:

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_STATIC_JAVA_LIBRARIES := libbaidumapapi
  5. LOCAL_SRC_FILES := $(call all-subdir-java-files)
  6. LOCAL_PACKAGE_NAME := MyMaps
  7. include $(BUILD_PACKAGE)
  8. ##################################################
  9. include $(CLEAR_VARS)
  10. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jar
  11. LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
  12. LOCAL_MODULE_TAGS := optional
  13. include $(BUILD_MULTI_PREBUILT)
  14. # Use the following include to make our testapk.
  15. 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中

  1. GRANDFATHERED_USER_MODULES += \
  2. … \
  3. libBMapApiEngine_v1_3_1

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

2.3 編譯結果

MyMaps.apk編譯生成在out/target/product/<YourProduct>/system/app/下;

libBMapApiEngine_v1_3_1.so放在out/target/product/<YourProduct>/system/lib/下,這也是系統載入動態庫時搜尋的路徑。