2014-02-28 149 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

相關問題