Android NDK共享库UnsatisfiedLinkError OpenGLESv2

时间:2014-02-28 18:07:40

标签: 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 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与设备上加载的版本不同,加载时导致冲突。

1 个答案:

答案 0 :(得分:0)

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

enter image description here


请在这些文件夹中复制.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