2012-01-12 56 views
4

這個問題似乎已經被問了很多,但都試圖使用eclipse來打包APK中的庫。 但是,我的要求是使用Android構建系統將庫包裝到APK中(稍後將使用System.loadLibrary()通過Java加載),即,我想編寫一個執行此項工作的Android.mk文件。如何在APK中打包預構建的共享庫

要求: 1.預建共享庫:libTest.so 2.寫一個Android.mk文件,將打包這對庫/ armeabi-7的APK內部。

對於我正在使用的編譯系統我不太瞭解,但是導出所需環境變量後使用「mm」命令完成編譯。

當我爲LOCAL_JNI_SHARED_LIBRARIES提供libTest時,它會嘗試在其導出的路徑中找到它,並無法在其中找到它,因此構建失敗。

任何人都可以請給任何指示寫一個Android.mk文件,將我的預構建共享庫打包到APK中?

回答

2

爲了預生成您的本機庫,你必須

  1. 在你的項目文件夾中創建jni文件夾
  2. 在你的項目文件夾中創建libs文件夾
  3. 添加Adnroid.mk make文件的JNI文件夾,它應該看起來像 這樣:

    LOCAL_PATH := $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_LDLIBS := -llog 
    LOCAL_MODULE := Test 
    LOCAL_SRC_FILES := Test.cpp 
    
    include $(BUILD_SHARED_LIBRARY) 
    

注1:Test.cpp是包含本地方法實現的主庫源文件。您可以將更多來源添加爲空格分隔列表。

注2:不要包含標題,它們會自動包含。注意3:如果需要啓用C++ STL,則創建另一個make文件 - Application.mk,將其添加到jni文件夾中,並在其中設置APP_STL := stlport_static標誌。

然後,你將不得不建立一個建設者。請參考this article如何做到這一點:

完成這些步驟後,構建器將在libs文件夾中創建您的庫,該文件夾將在構建整個應用程序時自動打包到apk中。

注意:您的庫名應該是小寫,它是一個Linux約定。 「lib」前綴將自動添加,因此最終的庫名稱將爲libtest.so。

0

比方說,有一個libxxx.so共享庫,在libs/armeabi/項目,你想打包到apk中。有需要在Android.mk下面做兩件事情:

# 1. Copy .so to out/target/product/***/obj/lib 
$(shell cp $(wildcard $(LOCAL_PATH)/libs/armeabi/*.so $(TARGET_OUT_INTERMEDIATE_LIBRARIES)) 

# 2. Make libxxx to be packed into apk 
LOCAL_JNI_SHARED_LIBRARIES := libs/libxxxx 


然後你可以使用apktool解包內置APK,你會發現libxxx.so將位於libs/armeabi*/。它確實包裝到apk中。

相關問題