Общая библиотека Android NDK UnsatisfiedLinkError OpenGLESv2

Я получаю ошибки «не могу найти символ» для функций OpenGLESv2, когда запускаю свое приложение.

02-28 12:49:43.443: E/art(1258): dlopen("/data/app-lib/com.xxx.xxx-2/libmy_ndk.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "glGenRenderbuffers" referenced by "libmy_ndk.so"...

Структура библиотеки следующая:

C++ Library compiled with toolchain -> libmy_ndk.so
JNI Code calls C++ Library -> libmy.so

Если я добавлю функции OpenGL в код JNI и полностью откажусь от библиотеки C++, все будет работать, как и ожидалось. Но по какой-то причине он не динамически связывает OpenGL во время выполнения, если я использую предварительно созданную общую библиотеку C++.

Мой make-файл выглядит так:

include $(CLEAR_VARS)
LOCAL_CFLAGS := -std=gnu++11
LOCAL_MODULE := my_ndk
LOCAL_SRC_FILES := libmy_ndk.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_LDLIBS := -lGLESv2
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := my
LOCAL_CFLAGS := -std=gnu++11
LOCAL_SRC_FILES := ndk.cpp
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog -landroid -lz
LOCAL_SHARED_LIBRARIES := my_ndk
include $(BUILD_SHARED_LIBRARY)

Я не получаю никаких ошибок компиляции, и все, кроме функций OpenGL, работает. Я попытался использовать LOCAL_LDLIBS := -lGLESv2 как для готовых, так и для общих библиотек, а затем изменил его на LOCAL_EXPORT_LDLIBS, как показано выше, и, похоже, никакая комбинация из них не работает.

РЕШЕНИЕ:

Проблема заключалась в компиляции библиотеки C++ с набором инструментов. libGLESv2.so, с которым он изначально связывался, не был той версией, которая была загружена на устройство, что вызывало конфликт при загрузке.


person aireyc    schedule 28.02.2014    source источник


Ответы (1)


Существуют разные папки для разных архитектур. Существует высокая вероятность того, что вы не предоставили свои собственные библиотеки для конкретной архитектуры, которую вы в настоящее время отлаживаете.

введите здесь описание изображения


Пожалуйста, скопируйте свои библиотеки .so в эти папки.
Надеюсь, это поможет.

Изменить:
добавьте требуемую функцию из приведенного ниже списка в файл Manifest.xml :

<-- require OpenGL ES version 1.0 (default) -->
<uses-feature android:glEsVersion="0x00010000"/>

<-- require OpenGL ES version 1.1 -->
<uses-feature android:glEsVersion="0x00010001"/>

<-- require OpenGL ES version 2.0 -->
<uses-feature android:glEsVersion="0x00020000"/>

<-- require OpenGL ES version 3.0 -->
<uses-feature android:glEsVersion="0x00030000"/>

Библиотека динамической линейки:
Перейдите по этой ссылке: NDK OpenGL неопределенная ссылка на glVertexPointer

person Salman Khakwani    schedule 28.02.2014
comment
Моя библиотека загружается нормально, если я отключу функции OpenGL. Я не могу заставить его динамически загружать /system/lib/libGLESv2.so. - person aireyc; 28.02.2014
comment
Вы тестируете на реальном устройстве или на эмуляторе? - person Salman Khakwani; 28.02.2014
comment
Настоящее устройство. Nexus 5 и Nexus 4. OpenGL работает, если я включаю функции в общую библиотеку кода jni, но не работает, когда функции вызываются из предварительно созданной библиотеки. - person aireyc; 28.02.2014
comment
Я должен добавить, что это также работает, если я скомпилирую библиотеку C++ статически и свяжу ее напрямую с кодом jni. - person aireyc; 28.02.2014