2012-03-20 78 views
4

我有一个程序,我创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并使用了独立工具链,我可以创建一个可在Android设备上运行的可执行文件。所以,看起来我建立的图书馆是功能性的。现在我正试图将这些库合并到一个应用程序中。所以,在我android.mk我有这样的事情:当预构建静态和共享库与Android NDK时链接问题

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

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

那么,我该如何正确使用一个预建的共享库,它的使用依赖于预建的静态库,而不是这个问题呢?

+0

您是否曾尝试在加载依赖该静态库之前加载静态库? – zapl 2012-03-20 00:57:15

+0

如何?我认为System.loadLibrary()仅适用于共享库。我认为自动处理静态库的方式不同。我可以尝试明天使用loadLibrary,但我认为这不起作用。 – corbin 2012-03-20 05:13:23

+0

这只是一个猜测 - 我不知道这是否真的有效。我一直在想,你需要将库加载到某种类型的java上下文中,以便另一个人知道在哪里查找以解决缺失的问题。 – zapl 2012-03-20 08:28:13

回答

4

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

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

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

+1

使用-lstaticlib重新创建共享库并获取它。 – corbin 2012-03-22 22:01:47