【问题标题】:Compiling with NDK gives error for successfully included header files使用 NDK 编译会导致成功包含头文件的错误
【发布时间】:2012-08-23 12:27:42
【问题描述】:

我的 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)

【问题讨论】:

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


    【解决方案1】:

    你需要添加:

    #define EGL_EGLEXT_PROTOTYPES
    

    在您的 #include 行之前(嗯,特别是在包含 EGL/eglext.h 之前)。

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

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

    #LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 我补充说。这是新的错误。在 /Users/geek/code/app/jni/app.h:20:0 包含的文件中,来自 /Users/geek/code/app/jni/app.cpp:17: /android-14/arch-arm/ usr/include/jni.h:592:13:注意:'va_list' 的修改在 GCC 4.4 /Users/geek/code/app/jni/jni_egl_fence.cpp 中发生了变化:在函数 'void Java_com_android_gallery3d_photoeditor_FilterStack_nativeEglSetFenceAndWait(JNIEnv*, jobject )': /Users/geek/code/app/jni/app.cpp:31:72: 错误: 'eglCreateSyncKHR' 未在此范围内声明
      • 这到底是什么意思?我对c++一无所知。 “'va_list' 的修改在 GCC 4.4 中发生了变化”
      • 这看起来像是一个警告。错误是“'eglCreateSyncKHR' 未在此范围内声明。”无论您在何处使用 EGL 函数,都需要包含 #include #include
      • 有关警告的更多信息,请参阅groups.google.com/forum/?fromgroups=#!topic/android-ndk/…
      • 查看我的 app.cpp,它们已包含
      【解决方案3】:

      我认为您应该按照以下步骤进行更多了解 steps

      在做bulid之前请先做酸

      • 项目路径直到 jni 文件夹 > 和 ndk 路径直到 ndk-build ex D:\New_Wok_2\Firstndk\jni>c:\android-ndk-r8\ndk-build 并清理您的项目

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 2016-02-25
        相关资源
        最近更新 更多