Android NDK 是一个不错的工具,在使用时也会遇到问题

(1) fatal error: EGL/egl.h: No such file or directory

一个很简单的程序,调用了eglGetDisplay函数,因为这个函数是在 EGL/egl.h 文件中声明的,因此

#include

包含了这个头文件,但是在编译时,总是提示上面的错误,找不到 EGL/egl.h 这个文件;

对比NDK samples中的另外一个Project native-activity,也需要这个文件;

问题原因:在Project的根目录下,缺少default.properties文件,需要在这个文件中指定target:

target=android-18

添加这个文件后,在文件中指定自己需要的target,再次使用ndk-build命令编译,则顺利通过;

一个奇怪的问题~

(2) 在Project的 jni 目录下,有一个Application.mk的文件,在里面指定APP_ABI的值,如果指定为all,则符合

ARM,X86,MIPS体系架构的目标文件都会生成,这会耗时比较多,通常我们只是用一个,例如armeabi-v7a,

则我们可以指定APP_ABI := armeabi-v7a

这样可以减少编译时间;

(3)

D/libEGL  ( 1017): Emulator without GPU support detected. Fallback to software renderer.

D/libEGL  ( 1017): loaded /system/lib/egl/libGLES_android.so

E/libEGL  ( 1017): dlopen("system/lib/libGLESv2.so") failed: dlopen failed: library "system/lib/libGLESv2.so" not found

E/libEGL  ( 1017): dlopen("system/lib/libGLESv1_CM.so") failed: dlopen failed: library "system/lib/libGLESv1_CM.so" not found

F/libEGL  ( 1017): couldn't load system OpenGL ES wrapper libraries

F/libc    ( 1017): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1017 (main)

在程序中,调用了eglGetDisplay函数,这个函数在EGL/egl.h中声明,因此 #include 包含了这个头文件,

这个函数在libEGL.so中实现的,因此在Android.mk中通过

LOCAL_LDLIBS    := -llog -lEGL

链接了libEGL.so文件,但是把生成的目标文件adb push到Android Virtual Device中运行时,报出上面的错误;

毫无头绪的错误信息~

修改Android.mk文件,把 LOCAL_LDLIBS    := -llog -lEGL 修改为:

LOCAL_LDLIBS    := -llog -lEGL -lGLESv2 -lGLESv1_CM

则顺利编译通过,并且能够在Android Virtual Device中正常运行,错误消失~

这是为什么呢?

查看EGL/Loader.cpp的代码,在函数Loader::open中:

hnd->set( load_driver("GLESv1_CM", tag, cnx, GLESv1_CM), GLESv1_CM );

hnd->set( load_driver("GLESv2",    tag, cnx, GLESv2),    GLESv2 );

static void* load_wrapper(const char* path) {

void* so = dlopen(path, RTLD_NOW | RTLD_LOCAL);

ALOGE_IF(!so, "dlopen(\"%s\") failed: %s", path, dlerror());

return so;

}

这是为什么呢?

(4)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐