合并两个库在android ndk中不起作用

时间:2016-09-20 11:39:02

标签: build android-ndk static-libraries

我在Android NDK中有一个测试应用。以前我能够使用提供的静态库编译和运行此应用程序。提供的静态库是" libfulllib.a"。现在我已经编写了包装器函数并创建了一个包装函数的库,即" libwrapper.a"。我工作的android.mk文件如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := rip_test
LOCAL_SRC_FILES := src/rip_test.cpp

LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v
LOCAL_C_INCLUDES := \
    $(LOCAL_PATH)/../../RIP/include/ \
    $(LOCAL_PATH)/../../../hardware/libhardware/include/hardware \
    $(LOCAL_PATH)/../../../hardware/libhardware/include \
    $(LOCAL_PATH)/src \
    $(LOCAL_PATH)/../../RIP/inc \

LOCAL_SHARED_LIBRARIES = libsmem.sastra

LOCAL_LDFLAGS := \
    -v \
    -L$(ANDROID_PRODUCT_OUT)/system/lib \
    -lsmem.$(TARGET_BOARD_PLATFORM) \
    -L$(LOCAL_PATH)/../../RIP/library \
    -lwrapper \
    -lfulllib \
    -llog \
    -lcutils \
    -lipc.$(TARGET_BOARD_PLATFORM) \

# this option will build executables instead of building library for
# android application.
include $(BUILD_EXECUTABLE)

这里的包装器是由我制作的库,完整包含函数的真实定义。 现在我不想让fulllib暴露给任何人,所以我把所有的" .o"来自包装和" fulllib。"并且制作了一个全部的'图书馆。现在我的android.mk看起来像这样:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := rip_test
LOCAL_SRC_FILES := src/rip_test.cpp

LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v
LOCAL_C_INCLUDES := \
    $(LOCAL_PATH)/../../RIP/include/ \
    $(LOCAL_PATH)/../../../hardware/libhardware/include/hardware \
    $(LOCAL_PATH)/../../../hardware/libhardware/include \
    $(LOCAL_PATH)/src \
    $(LOCAL_PATH)/../../RIP/inc \

LOCAL_SHARED_LIBRARIES = libsmem.sastra

LOCAL_LDFLAGS := \
    -v \
    -L$(ANDROID_PRODUCT_OUT)/system/lib \
    -lsmem.$(TARGET_BOARD_PLATFORM) \
    -L$(LOCAL_PATH)/../../RIP/library \
    -lall \
    -llog \
    -lcutils \
    -lipc.$(TARGET_BOARD_PLATFORM) \

# this option will build executables instead of building library for
# android application.
include $(BUILD_EXECUTABLE)

我能够编译,但测试应用程序不能正常工作。我想问一下: 这样做是否安全?

两者之间可能有什么区别?

1 个答案:

答案 0 :(得分:0)

合并两个静态库时可能会导致问题的一些事情:

  1. 两个库中都有重复的符号。

    如果两个模块都定义了一个函数foo,则未定义哪个模块将被使用。即使没有合并库也是如此,但通常使用找到的第一个符号,如果重新打包库使fulllib中的符号现在在wrapper之前,则可能使用了不同的定义

  2. 多个具有相同名称的.o文件。

    有很多方法可以安全地执行此操作,但是根据您在libfulllib.a中创建liball.aa foo.o的方式,可能会在libwrapper.a中覆盖一个(反之亦然)。

  3. 这可能不是一个详尽的清单,但这些是我过去遇到的一些问题。