7

这个问题似乎被问了很多,但所有人都试图使用 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 时,它会尝试在其导出的路径中找到它,但无法在其中找到它,因此构建失败。

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

4

3 回答 3

3

为了预先构建您的本机库,您必须

  1. 在项目文件夹中创建jni文件夹
  2. 在项目文件夹中创建libs文件夹
  3. Adnroid.mkmake 文件添加到 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在其中设置标志。

然后,您将必须设置一个构建器。请参阅本文了解如何执行此操作:

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

注意:你的库名应该是小写的,这是 Linux 的约定。“lib”前缀将被自动添加,因此最终的库名称将是 libtest.so。

于 2012-01-12T13:42:50.327 回答
1

假设您要打包到 apk 中的项目libxxx.so下有一个共享库。libs/armeabi/您需要做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中。

于 2012-11-25T03:58:34.190 回答
1

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

LOCAL_MODULE_TAGS := samples

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

于 2021-02-17T16:34:38.877 回答