将预构建的静态和共享库与Android NDK链接时的问题

时间:2012-03-20 00:14:34

标签: android android-ndk dynamic-linking

我有一个移植的程序,在创建可执行文件时将多个库链接在一起。我使用独立的工具链构建了所有这些库,并使用独立的工具链,我能够创建一个可在Android设备上运行的可执行文件。所以,我构建的库似乎是功能性的。现在我正在尝试将这些库与应用程序合并。所以,在我的android.mk中我有这样的东西:

LOCAL_PATH := $(call my-dir)
ROOT_PATH := $(LOCAL_PATH)

include $(call all-subdir-makefiles)
include $(CLEAR_VARS)

LOCAL_PATH = $(ROOT_PATH)

LOCAL_MODULE    := test-libs

LOCAL_STATIC_LIBRARIES := staticA
LOCAL_SHARED_LIBRARIES := sharedA sharedB sharedC sharedD
LOCAL_SRC_FILES := test-libs.c

include $(BUILD_SHARED_LIBRARY)

对于每个库,我都有像这样的Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sharedA

LOCAL_SRC_FILES := libsharedA.so

include $(PREBUILT_SHARED_LIBRARY)

静态库和其中一个共享库没有任何依赖关系,如果我只包含它们,那么一切都很酷。一个共享的预构建库仅依赖于静态预构建库,而其他库依赖于预构建的静态库和其他预构建的共享库。

问题是如果我通过System.loadLibrary()加载任何依赖于静态库的东西,我会收到有用的消息:

Unable to dlopen(libsharedA.so) Cannot load library: link_image

深入研究并遵循以下有关如何使用strace的建议:

http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html

我发现加载共享库时,它们无法找到静态库中的函数。

那么,我如何正确使用预先构建的共享库,其使用依赖于预构建的静态库而没有此问题?

1 个答案:

答案 0 :(得分:4)

共享库不应该依赖于静态库。

静态库用于链接(在编译时)到可执行文件,而不是用于在运行时添加。

如果您的共享库A使用静态库B,则在您将A链接在一起时构建B的共享版本或包含B.