Я получаю ошибки «не могу найти символ» для функций 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, с которым он изначально связывался, не был той версией, которая была загружена на устройство, что вызывало конфликт при загрузке.