Получавам грешки „не мога да намеря символ“ за функциите на 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, към който първоначално се свързваше, не беше същата версия, която беше заредена на устройството, което причиняваше конфликт при зареждане.