当我启动我的应用程序时,我收到“无法找到符号”错误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与设备上加载的版本不同,加载时会导致冲突。
如果我将OpenGL函数取出,它正在加载我的库。我无法动态加载/system/lib/libGLESv2.so。 – aireyc
您是在真实设备上还是在仿真器上测试? –
真实设备。 Nexus 5和Nexus 4.如果将函数包含在共享的jni代码库中,则OpenGL可以正常工作,但在从预先构建的库中调用函数时不起作用。 – aireyc