Общая библиотека Android GNU STL не может быть найдена с помощью System.loadLibrary - PullRequest
4 голосов
/ 04 января 2012

Я скомпилировал разделяемую библиотеку с 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

Если я не загружаю 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 и что загрузка его решит проблему. Это тот случай?

Edit: Теперь я включил библиотеку STL, как подсказывают ответы. Это строка компиляции, которую производит CMake (обратите внимание, что в моем проекте есть три файла: mother.c (доступна копия «Генератора случайных чисел» Джорджа Марсалиги здесь ), Driver.cpp, который содержит функции для проверки различные математические библиотеки и распечатывают время выполнения функции, и androidactivity.cpp, который содержит клей JNI и вызывает функцию теста из Driver.cpp. Подробный вывод Makefile, сгенерированный CMake, выглядит следующим образом. Я не уверен, что это полезная информация но

[ 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-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    

Помогает ли эта информация? Есть ли способ, которым я могу сказать, откуда исходит необнаруженный символ?

Ответы [ 6 ]

1 голос
/ 08 февраля 2013

В моем случае библиотека gnustl_shared на самом деле отсутствует на устройстве (работает под управлением Android 2.3.6).Когда я статически связываю gnustl, приложение NDK отлично работает на устройстве.мои 2 цента

1 голос
/ 02 декабря 2012

ну, вам нужно загрузить gnustl_shared перед вашими собственными библиотеками, что-то вроде этого:

static {
    System.loadLibrary("gnustl_shared");
    System.loadLibrary("myNativeLib1");
    System.loadLibrary("myNativeLib2");
    //.......
}
0 голосов
/ 03 декабря 2012

Вы показываете команды G ++, которые cmake сгенерировали.Они выглядят хорошо.Но компоновщик создал libMathTest.so на основе системной библиотеки STL.На самом деле, это смесь системного STL и gnustl (некоторые ссылки на последний, вероятно, пришли из cxx-stl / gnu-libstdc ++ / include ).

Это поможет, если вы откроетекоманда позади

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

Но, может быть, ваше приложение может быть удовлетворено системной библиотекой STL?Одним из важных преимуществ является то, что libstdc ++. So предустановлен на всех устройствах, как и libm .

0 голосов
/ 12 апреля 2012

Я столкнулся с той же проблемой, однако я сделал большую сборку с 6 общими библиотеками, все зависят от libgnustl_shared.so, и я сделал две сборки abi: armeabi и armeabi-v7a Все общие библиотеки были вручную скопированы в libs / (abi-name) /, включая libgnustl-shared.so. Сначала я создал System.load ("gnustl_shared"), но всякий раз, когда активность андроида пыталась загрузить 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, что тут не так !!!

Стивен

0 голосов
/ 09 января 2012

Полагаю, вам нужно будет упаковать соответствующие libgnustl_shared.so (по одному для каждого ABI, с которым вы собираетесь работать) в ваши APK libs / *.Что это значит именно для вашей пользовательской системы сборки CMake, я не могу вам сказать.

APK - это просто zip-файлы - вы можете открыть свой и убедиться, что он присутствует там, где ожидается.

0 голосов
/ 04 января 2012

Возможно, вам нужно добавить его и в Application.mk. Проект, который вы связали , сделал это как минимум .

...