放置 .so 文件的位置,以便将其包含在最终版本中



我有一个.so文件,它被AOSP系统包中的其他项目引用。为了使引用成为可能,我在 AOSP/外部包中创建了一个新项目,其中包含两个文件,即 Android.mk 和 xyz.so 文件。Android.mk 如下所示。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := customutil
LOCAL_SRC_FILES := xyz.so
include $(PREBUILT_SHARED_LIBRARY)

在编译过程中,它给了我以下错误。

make: * 没有规则使目标out/target/product/crespo/obj/lib/customutil.so', needed by/目标/产品/crespo/obj/可执行文件/abc_agent_intermediates/链接/abc_agent'。 停。

我应该在哪里保存、xyz.so 文件或我应该进行哪些更改,以便在构建 AOSP 时它不会产生此错误?


寿司

您的模块规则有问题。

当您有一个带有 LOCAL_MODULE := customutil 的预构建库时,链接器将获得额外的标志-lcustomutil。因此,您的LOCAL_SRC_FILES :=需要LOCAL_SRC_FILES := libcustomutil.so

因此,Android.mk 部分应为:

# Prebuilt Lib
include $(CLEAR_VARS)
LOCAL_MODULE := xyx
LOCAL_SRC_FILES := libxyz.so
include $(PREBUILT_SHARED_LIBRARY)

这也意味着您需要适当地重命名库或根据库名称设置模块名称。

默认情况下,对于预构建,LOCAL_SRC_FILES相对于您当前的LOCAL_PATH定义,因此如果您的 Android.mk 在 $PROJECT/jni/Android.mk 下,您应该将其放在 $PROJECT/jni/xyz.so

该名称也应该是可能的 libxyz.so 而不是 xyz.so(尽管这可能在没有 lib 前缀的情况下有效)。

如果您计划支持多个 CPU ABI,请尝试使用子目录,如下所示:

include $(CLEAR_VARS)
LOCAL_MODULE := libxyz
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libxyz.so
include $(PREBUILT_SHARED_LIBRARY)

并将文件放在:

$PROJECT/jni/armeabi/libxyz.so
$PROJECT/jni/armeabi-v7a/libxyz.so
$PROJECT/jni/x86/libxyz.so
...

最后,您还可以使用绝对路径进行LOCAL_SRC_FILES,构建系统将从那里选取文件。

我在AOSP源代码的外部文件夹中添加了预构建的.so文件,如下所示:-

步骤1:- 我在AOSP的外部文件夹中创建了一个文件夹(假设myLibs) 然后我在其中添加了我的 .so 文件,并在 Android.mk 文件中添加了以下代码

# Prebuilt Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libMyabc  # your lib name
LOCAL_SRC_FILES := libMyabc.so
  # your lib .so file name
include $(BUILD_SHARED_LIBRARY)  

然后我在LOCAL_SHARED_LIBRARIES部分的框架/base/core/jni/Android.mk 文件中添加了我的共享库名称。

现在它是在out/target/product/generic/obj/lib文件夹中生成我的.so文件

谢谢快乐编码...

最新更新