38

注意:这显然是 StackOverflow 上经常出现的问题,但是 - 就我所见 - 人们永远找不到方法,或者他们的解决方案对我不起作用

问题:

我正在使用 Eclipse Juno ADT。在我尝试更新 NDK 之前,一切正常。我用新版本(即)替换了我的ndk文件夹(即),并且在我的配置中,我将包含的内容从 g++ 4.6 更改为 4.7。ndk-r8dndk-r8ePaths and Symbols

它似乎打破了我的索引:我可以编译我的代码,但是 Eclipse 给出了语义错误,就像在 [ 1 ] 和 [ 2 ] 中一样。错误主要来自 OpenCV4Android 使用的符号,例如distance, pt,queryIdxtrainIdx.

当我尝试备份到旧配置时,索引仍然损坏!我找不到改变这种情况的方法。


我试过的

  • 清理项目
  • “索引”子菜单中的重建、刷新和所有其他选项(在项目上“右键单击”时)
  • 在首选项中禁用/启用索引器
  • 验证trainIdx仅出现在我的 OpenCV4Android 中的符号是否包含在该Paths and Symbols部分中。
  • 更改我在该Paths and Symbols部分中包含的顺序。我基本上试图将 OpenCV 包含在开头和结尾。

一些观察

什么不工作

我假设它是CDT 索引,原因如下:

  • 在命令行中,我可以使用ndk-build cleanand构建我的项目ndk-build
  • 当我启动 Eclipse 时,我没有错误,直到我打开一个 C++ 文件(从jni文件夹)。
  • 我总是可以构建项目,但只要我打开了一个 C++ 文件,我就无法再运行应用程序了,因为有很多Field '<name>' could not be resolved.
  • 如果我不打开 C++ 文件,Eclipse 不会报告任何错误,并且可以成功构建和部署 Android 应用程序。

有趣的事实

以下代码在line, queryIdx,上报告错误pt

cv::line(mRgb, keypointsA[matches[i].queryIdx].pt, keypointsB[matches[i].trainIdx].pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

如果我这样写,它可以工作:

cv::DMatch tmpMatch = matches[i];
cv::KeyPoint queryKp = keypointsA[tmpMatch.queryIdx];
cv::KeyPoint trainKp = keypointsB[tmpMatch.trainIdx];
cv::line(mRgb, queryKp.pt, trainKp.pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

并不是所有的 OpenCV 函数都未解析:只有pt,queryIdxtrainIdx是。

任何评论将不胜感激。

4

8 回答 8

33

在 Eclipse 环境中选择的项目首选项中,转到 C/C++ General -> Code Analysis -> Launching。确保两个复选框都未选中。关闭并重新打开项目或重新启动 eclipse 并重建项目。

于 2013-06-03T07:14:33.437 回答
10

由于 Eclipse 上的 Android 本机代码索引不完整,我设法以以下不直观的方式在我的 NDK 项目中启用索引,无论您使用ndk-build还是普通make甚至cmake. 我正在使用开普勒,但它也应该适用于旧版本。

让您的工具链正确

  • 右键单击项目 -> Properties-> C/C++ Build-> Tool Chain Editor-> 取消选中Display compatible toolchains only
  • 在同一窗口中,设置Current toolchainLinux GCC
  • 在同一个窗口中,如果你正在使用,设置为,Current builder否则设置为(这一步可能是错误的,如果是,请提前道歉)。Android Builderndk-buildGnu Make Builder
  • 右键单击项目 -> Properties-> C/C++ Build-> Build Variables-> 确保Build command为您的项目读取正确的命令;如果不是,请取消选中Use default build command并更正它(它可能是ndk-buildmake -j5您想要的)。如果您在单独的终端中构建本机代码,则可以跳过此步骤。

制作一个独立的工具链,这可能是在一个地方获取 STL 源代码的最简洁方式

  • 转到 NDK 根目录。
  • 运行以下命令(根据您的喜好调整设置)。sudo如果您没有写入权限,请添加,--install-dir因为脚本会静默失败。

        ./build/tools/make-standalone-toolchain.sh \
            --platform=android-14 \
            --install-dir=/opt/android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • 这是假设您使用 GNU-STL。如果您使用另一个 C/C++ 库,则需要调整上述命令,可能还需要调整下一个命令中的包含路径。

将必要的包含路径添加到您的项目中

  • 右键单击项目 -> Properties-> C/C++ General-> Paths and Symbols-> 转到Includes选项卡 -> 选择GNU C++- Languages> 单击Add并添加以下路径(假设您将独立工具链安装到/opt/android-toolchain):

    • /opt/android-toolchain/include/
    • /opt/android-toolchain/include/c++/4.8/
    • /opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include/
    • /opt/android-toolchain/include/c++/4.8/backward/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include-fixed/
    • /opt/android-toolchain/sysroot/usr/include/
  • 在这里,您可以添加所需的每个包含路径。事实上,我为 Android 构建了我的 OpenCV 并安装在独立工具链中,因此我在其中包含以下内容:

    • /opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/

现在,索引应该可以工作了。您还应该能够运行ndk-build(或者make如果这是您的构建方法),然后将您的项目部署到 Eclipse 中的设备。

为什么?

Eclipse 上的 Android 本机开发是不完整的,因为索引不能开箱即用。这是由于必须支持多种架构(ARMv7、Intel 等)、多种 STL 选项、多种 Android 版本等。这就是为什么你有裸机和整个 NDK 结构makendk-build原因,这也是为什么 NDK 开发非常不干净的原因并且很少有大量的原生 Android 项目存在。

一个大的 Android 项目是 OpenCV,他们必须开发一个 1500 多行的 CMake 脚本才能正确编译 Android。在某些时候,他们试图将该脚本导出为基于 CMake 的 Android 构建系统,但它无法跟上 NDK 系统的变化并被放弃。这种支持应该在 NDK 本身内部。

默认的 NDK 构建系统应该只是独立的工具链,所有不同的架构/C++ 库都有自己的工具链,但以存储空间为代价,但具有清洁、直观和良好实践的优势。然后,您可以合并任何在其他地方也使用过、经过测试且广为人知的标准交叉编译系统,例如 CMake。您可以并且在我看来您应该使用 NDK 的make-standalone-toolchain命令来执行此操作,如上所示。但最后,这只是我的看法。如果你觉得足够舒服,ndk-build那就继续吧。

于 2014-04-08T11:19:16.433 回答
6

实际上很难说是什么问题。这里有一些建议:

  1. 尝试导入和构建hello-jni(它位于jni'ssamples文件夹中)。如果它运行没有问题,那么问题在于将 OpenCV 链接到您的项目。
  2. 您似乎忘记android-ndkproject properties -> c/c++ build -> environment. 这是构建 Android NDK 项目的问题问题的链接。
  3. 从控制台构建您的项目 ( ndk-build -B),手动删除 Eclipse 中的所有错误(在Problems视图中选择所有错误并单击delete)并立即尝试运行项目。有时这个“hack”可以帮助我运行项目。
  4. 关闭 Eclipse 并删除文件夹path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core(先备份它)。
于 2013-06-02T10:28:03.537 回答
0

转到首选项 > C/C++ > 语言映射 > 添加(源 C 文件并选择 GNU C)对 C++ 执行相同操作

于 2014-01-05T21:32:27.210 回答
0

我遇到过同样的问题。我已经设置了所有正确的包含路径,但是在打开 .c/.cpp 或 .h 文件后,它会开始将所有内容标记为“未解决”。
这对我有用...
转到:
PREFERENCES -> C/C++ -> INDEXER
Check Index Source And Header Files Open in Editor

于 2014-10-21T06:02:15.853 回答
0

和很多人一样,我也有同样的问题。

我按照 Ayberk Özgür 帖子中的步骤进行操作,这很有意义。尽管我还必须确保在所有三种语言下都包含包含:GNU C、GNU C++ 和汇编。可能是因为我没有使用独立的工具链。

起初我只在 GNU C 和 GNU C++ 语言下包含我的内容。这让我仍然有未解决的包括错误。直到我在汇编语言下分配了我的包含,我的错误才消失。

我不知道为什么 eclipse 只搜索我项目中包含的汇编程序。我也不知道解决方案的这一部分将如何用于更大更复杂的项目。

希望这可以帮助。

于 2015-02-22T19:30:20.083 回答
0

Eclipse CDT 与 OpenCV 库一起工作时,我遇到了类似的情况。程序正确编译时,我收到了几条错误消息。我将“window->preferences->Indexer”“索引器的构建配置”框中的索引器设置更改为“使用活动配置”,这解决了我的问题。

于 2015-09-26T02:44:32.027 回答
0

我刚刚花了大约 3 个小时来解决这个 Eclipse NDK 索引问题!..

是什么使它起作用:确保您的 Application.mk 文件中只指定了一个 cpu 架构。

否则 .metadata/.plugins/com.android.ide.eclipse.ndk/*.pathInfo 文件将不会由 NDK 构建生成。该文件包含来自 Project -> Properties -> C/C++ General -> Paths and Symbols -> Includes 的内置值(仅制作 .pathInfo 文件并不能解决问题)

于 2016-03-16T13:09:23.570 回答