启动我的应用程序时,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,如上所示,并且这些组合似乎也无效。
SOLUTION:
问题是使用工具链编译C ++库。最初链接的libGLESv2.so与设备上加载的版本不同,加载时导致冲突。
答案 0 :(得分:0)
不同的体系结构有不同的文件夹,很有可能您没有为当前正在调试的特定体系结构提供本机库。
请在这些文件夹中复制.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"/>
动态班轮图书馆:
请仔细阅读以下链接:NDK OpenGL undefined reference to glVertexPointer