【发布时间】:2013-12-17 11:37:00
【问题描述】:
我正在努力让原生 Android 应用程序正确链接到在同一 AOSP 树中构建的自定义共享对象。
我有一个用
构建的共享对象LOCAL_SRC_FILES += \
src/libscanengine.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/
LOCAL_C_INCLUDES += kernel/include/
#every module depending on us will
#automagically have this included
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libscanengine
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
它作为 mm 命令调用构建和安装
build/core/dynamic_binary.mk:141: warning: overriding commands for target `.so'
build/core/dynamic_binary.mk:118: warning: ignoring old commands for target `.so'
build/core/shared_library.mk:54: warning: overriding commands for target `.so'
build/core/dynamic_binary.mk:141: warning: ignoring old commands for target `.so'
No private recovery resources for TARGET_DEVICE X
No recovery.fstab for TARGET_DEVICE X
make: Circular .so <- .so dependency dropped.
make: Circular .so <- out/target/product/X/symbols/system/lib/libscanengine dependency dropped.
make: Circular .so <- .so dependency dropped.
target Non-prelinked: libscanengine (out/target/product/X/symbols/system/lib/libscanengine)
target Strip: libscanengine (out/target/product/X/obj/lib/libscanengine)
Install: out/target/product/X/system/lib/libscanengine.so
一旦我尝试使用以下 Android.mk 构建与新创建的 .so 链接的本机应用程序
LOCAL_SRC_FILES := \
src/mores.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/include/
#not working: commented out
#LOCAL_LDLIBS += \
-lscanengine
#LOCAL_C_FLAGS += \
-L../../out/target/product/X/system/lib/
LOCAL_SHARED_LIBRARIES := \
libscanengine
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := mores
include $(BUILD_EXECUTABLE)
我明白了:
make: *** No rule to make target `out/target/product/X/obj/lib/libscanengine.so', needed by `out/target/product/X/obj/EXECUTABLES/mores_intermediates/LINKED/mores'. Stop.
我注意到两件事:共享库作为 libscanengine 安装在 X/out/lib 下,而不是本地应用程序所需的 libscanenegine.so。
我每次都必须手动复制 .so,这很愚蠢,因为所有这些都应该由 Android 构建系统以某种方式处理。
此外,LOCAL_EXPORT_C_INCLUDES 指令不起作用。它仅适用于 PREBUILT_SHARED_OBJECTS 吗?
Android 版本是 2.3,不涉及 Java,一切都在 AOSP 下构建。
谢谢
j
【问题讨论】:
-
INCLUDES 用于编译,而不是链接。您的 -L 可能有效,但它应该是 LDFLAGS 而不是 CFLAGS。不过,您必须弄清楚并修复错误的命名。
标签: android c++ android-ndk android-source