2016-09-20 61 views
0

中不起作用我在Android NDK中有一个测试应用程序。以前我能够使用提供的静态库编译和运行这个应用程序。提供的静态库是“libfulllib.a”。现在我已经编写了包装函数,并创建了一个包装函数库,即“libwrapper.a”。我的工作android.mk文件看起来像这样:两个库的合并在android ndk

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暴露给任何人,所以我从包装和“fulllib”中取出所有“.o”。并建立了一个'全部'图书馆。现在我的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) 

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

这两者有什么区别?

回答

0

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

  1. 在任一库重复的符号。

    如果两个模块都定义了功能foo,则不确定使用哪一个。即使不合并库也是如此,但通常会使用找到的第一个符号,并且如果重新打包库以使fulllib中的符号现在在wrapper之前,那么您可能会使用不同的定义。

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

    有办法可以安全地做到这一点,但取决于你创建liball.a的方式,libfulllib.a中的foo.o可能会覆盖libwrapper.a中的一个(反之亦然)。

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