如何在APK中打包预建的共享库

时间:2012-01-12 13:17:42

标签: android android-build

这个问题好像已被问到很多,但所有人都试图用eclipse将图书馆打包到APK中。 但是,我的要求是使用Android构建系统将库打包到APK中(稍后将使用System.loadLibrary()通过Java加载),即我想编写一个执行此工作的Android.mk文件。

要求: 1.预建共享库:libTest.so 2.编写一个Android.mk文件,将其打包到apk中的libs / armeabi-7。

我对我正在使用的构建系统了解不多,但编译是使用" mm"导出所需的环境变量后的命令。

当我为LOCAL_JNI_SHARED_LIBRARIES提供libTest时,它会尝试在其导出的路径中找到它并且无法在那里找到它,因此构建失败。

任何人都可以提供有关编写Android.mk文件的指示,该文件将我的预建共享库打包到APK中吗?

3 个答案:

答案 0 :(得分:3)

为了预建你的本地图书馆,你必须

  1. 在项目文件夹中创建jni文件夹
  2. 在项目文件夹中创建libs文件夹
  3. Adnroid.mk生成文件添加到jni文件夹,它应该是 这样:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_LDLIBS    := -llog
    LOCAL_MODULE    := Test
    LOCAL_SRC_FILES := Test.cpp
    
    include $(BUILD_SHARED_LIBRARY)
    
  4. 注1:Test.cpp是包含本机方法实现的主库源文件。您可以添加更多源作为空格分隔列表。

    注意2:不要包含标题,它们会自动包含在内。

    注意3:如果需要启用C ++ STL,请创建另一个make文件 - Application.mk,将其添加到jni文件夹并在其中设置APP_STL := stlport_static标记。

    然后你必须建立一个建造者。有关如何执行此操作,请参阅this article

    完成这些步骤后,构建器将在libs文件夹中创建您的库,该文件夹将在构建整个应用程序时自动打包到apk中。

    注意:您的库名称应为小写,这是Linux惯例。 " lib"将自动添加前缀,因此最终的库名称将为libtest.so。

答案 1 :(得分:1)

假设项目的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中。

答案 2 :(得分:1)

我想将两个 LOCAL_JNI_SHARED_LIBRARIES 构建到我的 APK 中。我设法通过在我的 Android.mk 中设置以下内容来做到这一点:

LOCAL_MODULE_TAGS := samples

重新编译模块后,我能够在 /lib/ 下的 .apk 中找到这两个库。

相关问题