这个问题好像已被问到很多,但所有人都试图用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中吗?
答案 0 :(得分:3)
为了预建你的本地图书馆,你必须
jni
文件夹libs
文件夹将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)
注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 中找到这两个库。