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

7
这个问题似乎已经被问了很多次,但所有人都试图使用eclipse将库打包到APK中。然而,我的需求是使用Android构建系统将库打包到APK中(稍后将使用Java中的System.loadLibrary()进行加载),即我想编写一个Android.mk文件来完成此任务。
要求: 1. 预构建共享库:libTest.so 2. 编写一个Android.mk文件,将其打包到apk的libs/armeabi-7目录下。
我不太了解我正在使用的构建系统,但在导出所需的环境变量后,使用“mm”命令进行编译。
当我将libTest添加到LOCAL_JNI_SHARED_LIBRARIES中时,它会尝试在其导出的路径中查找它,但找不到,因此构建失败。
请问有人可以指点我如何编写一个Android.mk文件来将我预先构建的共享库打包到APK中吗?
3个回答

3
为了预先构建本地库,您需要:
  1. Create jni folder in your project folder
  2. Create libs folder in your project folder
  3. Add Adnroid.mk make file to the jni folder, it should looks like this:

    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标志。
然后您需要设置构建器。请参考此文章了解如何完成:
完成上述步骤后,构建器将在libs文件夹中创建您的库,该库将在构建整个应用程序时自动打包到apk中。
注意:您的库名称应为小写,这是Linux约定。 "lib"前缀将自动添加,因此最终库名称将为libtest.so。

1

我有两个LOCAL_JNI_SHARED_LIBRARIES想要打包到我的APK中。我通过在Android.mk文件中设置以下内容成功完成:

LOCAL_MODULE_TAGS := samples

重新编译模块后,我能够在/lib/目录下找到两个库文件,它们都在.apk文件中。


1
假设在项目的libs/armeabi/目录下有一个名为libxxx.so的共享库,您想将其打包到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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接