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 Libs в тези папки.
Надявам се това да помогне.

Редактиране:
Моля, добавете необходимата функция от списъка по-долу във вашия 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"/>

Dynamic Liner Library:
Моля, преминете през тази връзка: 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