Android NDK共享库未满足链接错误OpenGLESv2

Android NDK共享库未满足链接错误OpenGLESv2,android,opengl-es,linker,android-ndk,runtime,Android,Opengl Es,Linker,Android Ndk,Runtime,当我启动应用程序时,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 co

当我启动应用程序时,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++库,它就可以正常工作。但由于某些原因,如果我使用的是预构建的C++共享库,它在运行时不会动态链接OpenGL。 我的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与设备上加载的版本不同,这导致加载时发生冲突。

不同的体系结构有不同的文件夹,很可能您没有为当前正在调试的特定体系结构提供本机库


请将您的.so LIB也复制到这些文件夹中。
我希望这有帮助

编辑:
请在
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"/>

动态线性程序库:

请浏览此链接:

如果我去掉OpenGL函数,我的库就可以加载了。我无法让它动态加载/system/lib/libGLESv2.so。您是在真实设备上测试还是在模拟器上测试?真实设备。Nexus5和Nexus4。OpenGL如果在共享JNI代码库中包含函数,那么当函数从预构建库调用时,它就不起作用。我应该添加,如果我静态编译C++库并直接与JNI代码链接,它也会起作用。