2016-09-20 66 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中的一個(反之亦然)。

這可能不是一個詳盡的清單,但這些都是我過去遇到的一些問題。