當我啓動我的應用程序時,我收到「無法找到符號」錯誤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