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

时间:2012-06-14 16:49:00

标签: android android-ndk android-source

我有一个.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输出/ target / product / crespo / obj / EXECUTABLES / abc_agent_intermediates / LINKED / abc_agent'。停止。

我应该保留哪些内容,xyz.so文件或我应该做出哪些更改,以便在构建AOSP时,不会出现此错误?


苏希尔

3 个答案:

答案 0 :(得分:1)

您的模块规则是个问题。

当你有一个带有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)

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

答案 1 :(得分:0)

默认情况下,对于预编译,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的绝对路径,构建系统将从那里选择文件。

答案 2 :(得分:0)

我在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部分的Frameworks / base / core / jni / Android.mk文件中添加了我的共享库名。

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

由于 快乐的编码...