无法使用System.loadLibrary找到Android的GNU STL共享库

无法使用System.loadLibrary找到Android的GNU STL共享库,android,stl,android-ndk,Android,Stl,Android Ndk,我已经用android cmake和NDK针对libstdc++编译了一个共享库,根据android-NDK-r7/docs/CPLUSPLUS-SUPPORT.html,我正在尝试在加载库之前加载gnustl_shared: static { System.loadLibrary("gnustl_shared"); System.loadLibrary("MathTest"); } 例如,我可以看到这样做,但我得到一个例外: 01-03 20:02:42.307: E/And

我已经用android cmake和NDK针对libstdc++编译了一个共享库,根据android-NDK-r7/docs/CPLUSPLUS-SUPPORT.html,我正在尝试在加载库之前加载gnustl_shared:

static {
    System.loadLibrary("gnustl_shared");
    System.loadLibrary("MathTest");
}
例如,我可以看到这样做,但我得到一个例外:

01-03 20:02:42.307: E/AndroidRuntime(569): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null
01-03 20:03:04.667: E/AndroidRuntime(603): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1311]:    33 cannot locate '_ZNSo3putEc'...
如果我没有加载gnustl_shared,它将失败,出现以下异常:

01-03 20:02:42.307: E/AndroidRuntime(569): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null
01-03 20:03:04.667: E/AndroidRuntime(603): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1311]:    33 cannot locate '_ZNSo3putEc'...
我在API级别8和9上测试过同样的问题。我做错了什么?我假设它在最后一个异常中寻找的符号与STL相关,加载它可以解决问题。是这样吗

编辑: 我现在已经包括了答案中建议的STL库。CMake生成的编译行是这样的:我的项目有三个文件,mother.c是George Marsaliga的所有可用随机数生成器之母的副本,Driver.cpp包含测试不同数学库和打印函数运行时的函数,以及androidactivity.cpp,它包含JNI胶水并从Driver.cpp调用测试函数。CMake生成的详细Makefile输出如下所示。我不确定这是否是有用的信息,但是

[ 33%] Building CXX object CMakeFiles/MathTest.dir/src/Driver.cpp.o
/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++   -DMathTest_EXPORTS -D__STDC_INT64__ --sysroot=/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fexceptions -fno-check-new -fno-common -fstrict-aliasing -Wno-variadic-macros -Wextra -pedantic -g0 -O2 -fPIC -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/Users/martin/Repositories/MathTest/lib/cml-1_0_2 -I/Users/martin/Repositories/MathTest/lib/eigen-eigen-13a11181fc5a -I/Users/martin/Repositories/MathTest/lib/glm-0.9.3.B   -o CMakeFiles/MathTest.dir/src/Driver.cpp.o -c /Users/martin/Repositories/MathTest/src/Driver.cpp
"/Applications/CMake 2.8-4.app/Contents/bin/cmake" -E cmake_progress_report /Users/martin/Repositories/MathTest/build/android/CMakeFiles 2
[ 66%] Building C object CMakeFiles/MathTest.dir/src/mother.c.o
/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc  -DMathTest_EXPORTS -D__STDC_INT64__ --sysroot=/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -O3 -DNDEBUG -fPIC -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/Users/martin/Repositories/MathTest/lib/cml-1_0_2 -I/Users/martin/Repositories/MathTest/lib/eigen-eigen-13a11181fc5a -I/Users/martin/Repositories/MathTest/lib/glm-0.9.3.B   -o CMakeFiles/MathTest.dir/src/mother.c.o   -c /Users/martin/Repositories/MathTest/src/mother.c
"/Applications/CMake 2.8-4.app/Contents/bin/cmake" -E cmake_progress_report /Users/martin/Repositories/MathTest/build/android/CMakeFiles 3
[100%] Building CXX object CMakeFiles/MathTest.dir/src/androidactivity.cpp.o
/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++   -DMathTest_EXPORTS -D__STDC_INT64__ --sysroot=/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fexceptions -fno-check-new -fno-common -fstrict-aliasing -Wno-variadic-macros -Wextra -pedantic -g0 -O2 -fPIC -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/Users/martin/Repositories/MathTest/lib/cml-1_0_2 -I/Users/martin/Repositories/MathTest/lib/eigen-eigen-13a11181fc5a -I/Users/martin/Repositories/MathTest/lib/glm-0.9.3.B   -o CMakeFiles/MathTest.dir/src/androidactivity.cpp.o -c /Users/martin/Repositories/MathTest/src/androidactivity.cpp
Linking CXX shared library ../../android/libs/armeabi/libMathTest.so
readelf显示,我的库依赖于libstdc++、libm、libc和libdl,据我所知,除了libstdc++之外,所有这些都可以根据android-ndk-r7/docs/STABLE-api.html在设备上使用


这些信息有用吗?有没有办法知道未找到的符号来自何处?

您可能还需要将其添加到Application.mk中。您链接的项目。

我相信您需要打包适当的libgnustl_共享。因此,您打算在APK libs/*中使用的每个ABI都有一个。我不能告诉你这对你的定制CMake构建系统到底意味着什么


APK只是zip文件-您可以打开自己的文件并确保它在预期的位置出现。

我遇到了同样的问题,但是我创建了一个包含6个共享库的大型版本,所有这些都依赖于libgnustl_shared.so,我创建了两个abi版本:armeabi和armeabi-v7a 所有共享库都被手动复制到libs/abi name/,包括libgnustl-shared.so。我首先让System.load gnustl_共享,但每当android活动尝试加载lib时,它都会例外,并说gnustl_共享未找到。我试过使用Androip-8、android-9和android-14,它们都有相同的错误

_HERE THE ANDROID.MK_   

MYTOP_DIR        := $(call my-dir)   
LOCAL_PATH       :=  $(MYTOP_DIR)  
include $(CLEAR_VARS)  

NDK_ROOT         := /home/workspace/android-ndk-r7  
RUNTIME_STL_PATH :=$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++  

# name of the module to be built  
LOCAL_MODULE := MyMediaPlayer  
LOCAL_SRC_FILES := MyMediaPlayer.cpp  
LOCAL_C_INCLUDES   := $(LOCAL_PATH)/libMediaClient/include  

# rule definition  
LOCAL_CPP_EXTENSION := .cxx .cpp .cc  
LOCAL_CFLAGS        += -I$(RUNTIME_STL_PATH)/include  
LOCAL_CFLAGS        += -I$(RUNTIME_STL_PATH)/libs/$(TARGET_ARCH_ABI)/include  
LOCAL_LDLIBS        += -llog  
LOCAL_LDLIBS        += -landroid  
LOCAL_LDLIBS        += -L$(RUNTIME_STL_PATH)/libs/$(TARGET_ARCH_ABI)  
LOCAL_LDLIBS        += -lgnustl_shared  
LOCAL_LDLIBS        += -L$(LOCAL_PATH)/libMediaClient/lib/android/$(TARGET_ARCH_ABI)  
LOCAL_LDLIBS        += -lMediaClient  
LOCAL_LDLIBS        += -ltools  
include $(BUILD_SHARED_LIBRARY)


_HERE THE APPLICATION.MK_  

APP_ABI             := armeabi armeabi-v7a
APP_STL             := gnustl_shared  # this doesn't make any sense
APP_MODULES         := MyMediaPlayer
我可以通过加载我自己的libs来理解是否发生异常,但是这里的libgnustil_共享确实来自ndk,这里出了什么问题


Steven

嗯,您需要在自己的库之前加载gnustl_共享,如下所示:

static {
    System.loadLibrary("gnustl_shared");
    System.loadLibrary("myNativeLib1");
    System.loadLibrary("myNativeLib2");
    //.......
}

您将显示cmake生成的G++命令。它们看起来不错。但是链接器基于系统STL库生成了libMathTest.so。实际上,它是系统STL和gnustl的混合体。对后者的一些引用可能来自cxx STL/gnu libstdc++/include

如果你回显后面的实际命令会有所帮助

Linking CXX shared library ../../android/libs/armeabi/libMathTest.so

但是,您的应用程序可能会对系统STL库感到满意吗?一个重要的优点是,libstdc++.so与libm一样预先安装在所有设备上。

在我的情况下,gnustl_共享库实际上并不在运行Android 2.3.6的设备上。当我静态链接gnustl时,NDK应用程序在设备上运行良好。
我的2美分

不幸的是,这没有帮助,因为我没有使用ndk构建。我正在使用CMake编译我的所有源代码。感谢您提供的信息,我现在可以在Android中成功加载STL库,但在尝试加载我自己的库时仍然会遇到相同的异常。我会调查更多信息并更新我的帖子。这是我的答案-我正在使用NVIDIA的android代码,当我使用Clang编译时,我需要使用LLVM libc++static,与属性菜单中的GCC和GNU libstd++static相同