使用NDK进行编译会为成功包含的头文件提供错误

时间:2012-08-23 12:27:43

标签: android android-ndk java-native-interface

我的app.cpp:

#include "app.h"


#include <EGL/egl.h>
#include <EGL/eglext.h>

void
Java_com_geek_hello_FilterStack_nativeEglSetFenceAndWait(JNIEnv* env, jobject thiz) {
  EGLDisplay display = eglGetCurrentDisplay();

  // Create a egl fence and wait for egl to return it.
  // Additional reference on egl fence sync can be found in:
  // http://www.khronos.org/registry/vg/extensions/KHR/EGL_KHR_fence_sync.txt
  EGLSyncKHR fence = eglCreateSyncKHR(display, EGL_SYNC_FENCE_KHR, NULL);
  if (fence == EGL_NO_SYNC_KHR) {
    return;
  }
  ...

当我运行ndk-build时,它找不到egl.h中存在的方法,并且没有创建.so。这是日志:

app.cpp:31:72: error: 'eglCreateSyncKHR' was not declared in this scope 

后面是属于

的所有KHR方法

这是Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

#LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES
LOCAL_CFLAGS = -Wno-psabi

LOCAL_SRC_FILES := app.cpp

#LOCAL_SHARED_LIBRARIES := libcutils libEGL

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := libapp
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2

include $(BUILD_SHARED_LIBRARY)

3 个答案:

答案 0 :(得分:5)

您需要添加:

#define EGL_EGLEXT_PROTOTYPES

#include行之前(特别是在包括EGL/eglext.h之前)。

另外(看起来你已经这样做了),你需要至少针对API 14进行构建,因为这是第一个在公共API中公开此函数的API级别。

编辑:或者只是取消注释Android.mk中的行:

#LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES

答案 1 :(得分:2)

尝试执行以下所有步骤:

http://en.wikibooks.org/wiki/OpenGL_Programming/Android_GLUT_Wrapper

从您提供的日志中,构建找不到EGL库,所以我认为您需要该行

LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv2
在你的Android.mk中

。并确保您的Application.mk包括:

APP_STL := gnustl_static
APP_PLATFORM := android-9

答案 2 :(得分:1)

我认为您应该遵循这些步骤以获得更多理解 steps

并且在制造之前使其变得酸涩

  • 项目路径直到jni folde&gt;和ndk路径直到ndk-build ex D:\ New_Wok_2 \ Firstndk \ jni&gt; c:\ android-ndk-r8 \ ndk-build 并清理你的项目