Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android NDK预构建静态和共享库时的链接问题_Android_Android Ndk_Dynamic Linking - Fatal编程技术网

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

使用Android NDK预构建静态和共享库时的链接问题,android,android-ndk,dynamic-linking,Android,Android Ndk,Dynamic Linking,我有一个正在移植的程序,在创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并且使用独立工具链,我能够创建一个在android设备上工作的可执行文件。所以,我建立的库似乎是功能性的。现在我正在尝试将这些库与应用程序合并。因此,在我的android.mk中,我有如下内容: LOCAL_PATH := $(call my-dir) ROOT_PATH := $(LOCAL_PATH) include $(call all-subdir-makefiles) include

我有一个正在移植的程序,在创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并且使用独立工具链,我能够创建一个在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的建议:

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


那么,如何正确使用依赖于预构建静态库的预构建共享库而不存在此问题呢

共享库不应依赖于静态库

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


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

在加载依赖于该库的静态库之前,是否尝试加载该静态库?如何加载?我以为System.loadLibrary()只用于共享库。我认为静态库是以不同的方式自动处理的。明天我可以尝试使用loadLibrary,但我认为这不管用。这只是一个猜测——我不知道这是否真的管用。我在想,您需要将库加载到某种java上下文中,以便另一个知道在何处查找以解决缺少的内容。