2014-02-28 150 views
1

当我启动我的应用程序时,我收到“无法找到符号”错误OpenGLESv2函数。Android NDK共享库UnsatisfiedLinkError 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

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

enter image description here


请你的。所以利布斯复制这些文件夹以及。
我希望这有助于。

编辑:
请从下面的列表中选择所需功能加入您的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

+0

如果我将OpenGL函数取出,它正在加载我的库。我无法动态加载/system/lib/libGLESv2.so。 – aireyc

+0

您是在真实设备上还是在仿真器上测试? –

+0

真实设备。 Nexus 5和Nexus 4.如果将函数包含在共享的jni代码库中,则OpenGL可以正常工作,但在从预先构建的库中调用函数时不起作用。 – aireyc

相关问题