Ошибка выполнения Android: ошибка dlopen: не удается найти символ __cxa_end_cleanup, на который ссылается libcryptopp.so

Я пытался скомпилировать/связать/запустить проект Android, который использует NDK и имеет 2 этапа компиляции NDK. Мне удалось скомпилировать с помощью GNU-libstdc++ без включения CryptoPP, отличной альтернативы библиотекам OpenSSL для шифрования. С CryptoPP я получаю ошибку времени выполнения, указанную в заголовке.

При компиляции моего проекта Android NDK у меня нет ошибок компилятора, однако во время выполнения библиотека CryptoPP не может найти символ "__cxa_end_cleanup". Я попытался вручную перекомпилировать файл libcryptopp.so, используя STLport, а также GNU-libstdc++, и оба приводят к одной и той же ошибке времени выполнения. Я следовал инструкциям на http://www.cryptopp.com/wiki/Android_(Command_Line ). Я правильно меняю APP_STL при смене компиляторов.

Глядя в Интернет, кажется, что эта ошибка связана с обработкой исключений C++, и поэтому я попытался удалить строку из Android.mk "LOCAL_CPP_FEATURES += exceptions", чтобы исключения не включались, но снова , та же ошибка во время выполнения.

Я также загружаю библиотеки в правильном обратном порядке на стороне Java JNI. System.loadLibrary("cryptopp") предшествует загрузке моей другой пользовательской библиотеки.

Я также попытался включить stlport_shared.so в папку armeabi/ и загрузить сначала, а затем cryptopp, и та же ошибка.

Точно так же я попытался включить библиотеку libsupc++.a в папку armeabi/ при компиляции с помощью GNU-libstdc++, так как это библиотека C++, которая добавляет обработку исключений, и включил ссылки на нее в Android.mk "LOCAL_CFLAGS += -lsupc++" и "LOCAL_WHOLE_STATIC_LIBRARIES := libsupc++.a"

Были ли у кого-нибудь подобные проблемы при использовании CryptoPP с Android? И если да, то как вы настроили make-файлы для правильной компоновки библиотек? Наконец, есть идеи, почему это не вызывает ошибку во время компиляции, а только во время выполнения? Полная ошибка вставлена ​​ниже:

E/dalvikvm(15888): ошибка dlopen("/data/app-lib/com.example.test_app/libcryptopp.so"): ошибка dlopen: не удается найти символ "__cxa_end_cleanup", на который ссылается "libcryptopp.so". ..


person DanielG    schedule 28.08.2014    source источник
comment
В вики в разделе Выполнить программу ANDROID_STL_LIB (/opt/android-ndk-r9/sources/cxx-stl/stlport/libs/armeabi/libstlport_shared.so) также был нажат на устройство. Пробовали ли вы включить libstlport_shared.so в папку armeabi/? Кроме того, нет причин пытаться включить в папку статический архив (*.a).   -  person jww    schedule 29.08.2014
comment
Я также попытался включить stlport_shared.so в папку armeabi/ и загрузить сначала, а затем cryptopp, и та же ошибка. Да, это тоже пробовал, все равно спасибо за предложение! Я все еще получаю ту же ошибку времени выполнения, связанную с этим отсутствующим символом cxa_end_cleanup.   -  person DanielG    schedule 29.08.2014
comment
Как ты тут выбрался? Я нашел ошибку в предоставленных вами справочных материалах — вики Crypto++, скрипте кросс-компиляции, патчах Crytpo++ и предварительно собранной библиотеке (к сожалению, я написал их все). Ошибка заключалась в том, что GNUMakefile Crypto++ не включал LDLLIBS или LDFLAGS, поэтому в общем объекте отсутствовала зависимость от libstlport_shared.so. В настоящее время проблемы исправлены, а материал обновлен.   -  person jww    schedule 03.09.2014
comment
пинг... как дела?   -  person jww    schedule 11.09.2014


Ответы (1)


Привет, я столкнулся с той же проблемой при использовании NDK и STL, и я решил ее только сейчас. Я обнаружил, что моя родная библиотека будет зависеть от STL, но Dalvik VM не загрузит ее из системы автоматически, даже если я упакую ее в файл APK. Поэтому я пытаюсь загрузить его самостоятельно, добавив строку в файл JAVA:

System.loadLibrary("stlport_shared");

Где выглядит мой Application.mk:

APP_ABI := armeabi-v7a-hard
APP_STL := stlport_shared

Возможно, это поможет вам

person Edson    schedule 24.09.2014