【问题标题】:Eclipse ADT "... could not be resolved" with Android NDK and C filesEclipse ADT“...无法解决”与 Android NDK 和 C 文件
【发布时间】:2013-10-14 12:51:00
【问题描述】:

我的 NDK 项目的 Eclipse 索引器出现问题。那里有很多类似的线程,但似乎没有一个涉及相同的问题来源。我有一个 OpenGL ES 应用程序,我需要将它移植到纯粹用 C 语言编写的 Android,我想作为 NativeActivity 运行,最好没有附加 Java。经过大量重写后,代码使用ndk-build 编译得很好,但是从IDE 中出现了很多错误,例如Type 'GLfloat' could not be resolved。生成了一个 APK,我可以使用 adb 安装它,但我希望能够使用 IDE,尤其是用于调试。

如果我在上下文菜单中为 #include <GLES2/gl2.h> 之类的行选择“打开声明”,则 Eclipse 能够显示该文件,并且我看到 GLfloat 定义在那里,但在将鼠标悬停在任何内容上时我没有得到任何信息该文件,所以我猜索引器只是以某种方式跳过它?不在 Android NDK 目录中的头文件可以很好地编入索引,例如 jni 文件夹和 jni/png 等子文件夹中的头文件。我在C/C++ Build -> Environment 下定义了NDKROOT root,这是一个具有本机功能并使用CDT 视图的项目。

我注意到的一件事是,当我最初设置项目时,我有一个 .cpp 文件,索引器为其提供 Android NDK 信息没有问题,但一旦我将其更改为 .c,错误就开始出现.我的印象是,Android NDK 是为仅支持基本 C++ 的 C 而设计的,但在示例中四处查看,所以我只看到一堆 .cpp 文件,所以我很困惑。我尝试在我的Android.mk 中设置LOCAL_CPP_EXTENSION += .c,但这会导致Eclipse 在构建期间挂起。我没有尝试过的最后一件事是重命名所有文件,以便使用 C++ 编译器编译它们,但我不明白为什么这应该是必要的,而且我有一些第三方库,如源代码中包含的 zlib而不是摆弄。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

define all-cpp-files-under
$(patsubst ./%, %, \
    $(shell cd $(LOCAL_PATH) ; \
        find $(1) -name "*.c" -and -not -name ".*") \
)
endef

LOCAL_MODULE    := MyProject
LOCAL_SRC_FILES := $(call all-cpp-files-under, .)
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 -lOpenSLES
LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_C_INCLUDES += $(LOCAL_PATH)/jansson
LOCAL_C_INCLUDES += $(LOCAL_PATH)/zlib
LOCAL_C_INCLUDES += $(LOCAL_PATH)/png

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

应用程序.mk

APP_PLATFORM := android-9
APP_ABI := all

【问题讨论】:

  • 如果你注释掉APP_ABI := all会发生什么?
  • 没有发生太多事情。错误仍然存​​在,并且 Includes 文件夹显示相同的 arm 条目。我也尝试过清理和重新索引。
  • 查看我的答案stackoverflow.com/a/22935387/1525238 以获得完整的索引功能。

标签: c eclipse android-ndk adt


【解决方案1】:

这可能不是解决问题的正确方法,但您可以找到文件${WORKSPACE_LOC}/.metadata/.plugins/com.android.ide.eclipse.ndk/${ProjName}.pathinfo。它是一个文本文件,格式简单。首先,尝试删除此文件,然后重建项目。如果这没有帮助,您可以添加

i,d:/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.6/include
i,d:/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.6/include-fixed
i,D:/Android/android-ndk-r9/platforms/android-14/arch-arm/usr/include

手动(以上示例适用于 Windows)。

更新更好的解决方法是设置 ADT 以正确使用 indexer,请参阅 Android NDK build, Method could not be resolvedEclipse compiles successfully but still gives semantic errors .

【讨论】:

  • 我尝试删除它,但重建的文件看起来完全一样。该文件已包含顶部的那些包含路径,文件头如下所示:pastebin.com/pUvJbjxK
  • 在您的 Eclipse 中,您看到 GLfloat 是绿色的,还是带有红色下划线的?如果不是绿色,尝试注释掉所有C文件,并在顶部添加两行:#include <GLES2/gl2.h>GLfloat qqq;现在是绿色了吗?
  • 不,只有这两行,GLfloat 仍然是红色的。我确实尝试将基础jni 文件夹中的所有.c 文件重命名为.cpp,另一方面,这会变成GLfloat,当我将它悬停时,它会说它是khronos_float_t 的typedef。问题似乎是 IDE 将 Android NDK 标头解释为 C++,但我不知道如何解决。
  • 在您的 Eclipse 项目 Properties 中,当您关闭 Show built-in values 时,C/C++ General -> Paths and Symbols 会显示什么?开吗?
  • 我应该补充一点,我已经完成了 Android SDK 和 NDK 的全新安装,现在我还可以使用 ndk-gdb 进行调试。我还没有检查我是否可以使用 .c 文件,但此时没关系,因为我已经重写了所有内容,所以我现在可以完成工作了。
【解决方案2】:

右键单击 jni 文件夹并获得属性单击 c/c++ general 并在包含文件夹中包含 以下文件存在于您的 ndk 中,请导入并且必须点击应用

d:/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.6/include
i,d:/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.6/include-fixed
i,D:/Android/android-ndk-r9/platforms/android-14/arch-arm/usr/include

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 2014-08-07
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多