2012-01-03 105 views
4

我編譯了一個共享庫與android-cmake和NDK對libstdC++,並根據android-ndk-r7/docs/CPLUSPLUS-SUPPORT.html我試圖加載我的圖書館前加載gnustl_shared:Android的GNU STL共享庫無法找到與System.loadLibrary

static { 
    System.loadLibrary("gnustl_shared"); 
    System.loadLibrary("MathTest"); 
} 

我可以看到這個正在做,例如here,但我得到一個異常:

01-03 20:02:42.307: E/AndroidRuntime(569): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null 

如果我不加載gnustl_shared,它以下例外情況失敗:

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庫。 (注意我的項目有三個文件,mother.c(George Marsaliga的所有隨機數生成器的母親的副本可用here),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,libclibdl,據我所知除了libstdc++以外,所有這些都可以在設備上按照android-ndk-r7/docs/STABLE-APIS.html獲得。

Martin-Foots-MacBook-Pro:android martin$ ~/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-readelf -d ../../android/libs/armeabi/libMathTest.so 

Dynamic section at offset 0x14b0 contains 25 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libstdc++.so] 
0x00000001 (NEEDED)      Shared library: [libm.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x0000000e (SONAME)      Library soname: [libMathTest.so] 
0x00000010 (SYMBOLIC)     0x0 
0x00000019 (INIT_ARRAY)     0x9498 
0x0000001b (INIT_ARRAYSZ)    12 (bytes) 
0x0000001a (FINI_ARRAY)     0x94a4 
0x0000001c (FINI_ARRAYSZ)    12 (bytes) 
0x00000004 (HASH)      0xd4 
0x00000005 (STRTAB)      0x544 
0x00000006 (SYMTAB)      0x234 
0x0000000a (STRSZ)      1033 (bytes) 
0x0000000b (SYMENT)      16 (bytes) 
0x00000003 (PLTGOT)      0x9598 
0x00000002 (PLTRELSZ)     136 (bytes) 
0x00000014 (PLTREL)      REL 
0x00000017 (JMPREL)      0x990 
0x00000011 (REL)      0x950 
0x00000012 (RELSZ)      64 (bytes) 
0x00000013 (RELENT)      8 (bytes) 
0x00000016 (TEXTREL)     0x0 
0x6ffffffa (RELCOUNT)     4 
0x00000000 (NULL)      0x0  

該信息有幫助嗎?有沒有一種方法可以告訴我這個未知的符號來自哪裏?

回答

0

您可能還需要將其添加到Application.mk中。您鏈接did this at least的項目。

+0

不幸的是,這並沒有幫助,因爲我沒有使用ndk-build。我使用CMake來編譯我所有的源代碼。 – 2012-01-04 16:38:39

0

我相信你需要在你的APK libs/*中打包相應的libgnustl_shared.so(每個ABI你打算使用的一個)。這對我的定製CMake構建系統來說意味着什麼,我無法告訴你。

APK只是zip文件 - 你可以打開你的,並確保它存在於預期的地方。

+1

感謝您的信息,我現在可以在Android中成功加載STL庫,但在嘗試加載自己的庫時仍然會遇到相同的異常。我會進一步調查並更新我的帖子以獲取更多信息。 – 2012-01-10 10:47:43

-2

我遇到了同樣的問題,但是我做了一個大的構建與6個共享庫,都依賴於libgnustl_shared.so,和我做了兩個ABI構建:armeabi和armeabi-V7A 所有共享庫手動複製到庫/(abi-name)/,包括libgnustl-shared.so。我在第一個地方創建了System.load(「gnustl_shared」),但是每當android活動嘗試加載lib時,它都會除外,並說未找到gnustl_shared。我試着用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 

如果通過加載自己的庫出現異常,但這裏的libgnustil_shared確實來自NDK,有什麼錯在這裏我能理解!

史蒂芬

+2

這不是一個答案 – 2013-07-12 10:02:46

1

好,你需要在你自己的庫來加載gnustl_shared,是這樣的:

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

您展現G ++命令,cmake的產生。他們看起來不錯。但鏈接器基於系統STL庫生成了libMathTest.so。實際上,它是系統STL和gnustl的混合體(對後者的一些引用可能來自cxx-stl/gnu-libstdC++/include)。

如果你呼應背後

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

但是,也許你的應用程序可以得到滿意的系統STL庫的實際命令這將有助於?一個重要的優點是,libstdC++。so已預裝在所有設備上,就像libm一樣。

0

在我的情況下,gnustl_shared庫實際上不在設備上(運行Android 2.3.6)。當我靜態鏈接gnustl時,NDK應用程序在設備上運行良好。 我的2美分