【问题标题】:NDK unable to deal with #include with relative paths?NDK 无法处理带有相对路径的#include?
【发布时间】:2014-08-19 04:51:02
【问题描述】:

我正在使用 Eclipse + NDK (r8d) 编写一个带有一些 C++ 代码的 Adroid 应用程序。我有一些我认为是万无一失的代码,但编译器只是给了我一些奇怪的错误,比如“无效参数”而没有具体说明。这是我的 C++ 代码的样子:

#include <jni.h>
#include <string>
using namespace std;
#include "../../Evaluator.Engine/Evaluator.Engine.h"

Evaluator evaluator;

extern "C" {
    JNIEXPORT jstring JNICALL Java_haskellevaluator_android_MainActivity_evaluateNative(JNIEnv *env, jobject, jstring jInput)
    {
        ...
        string sInput(L"Hello world");
        string sResult = evaluator.evaluate(sInput);
        jstring jResult = env->NewStringUTF(sResult.data());
        return jResult;
    }
}

Evaluator.Engine.h 没有什么花哨的,只是类 Evaluator 的声明。

#include <string>
using namespace std;

class Evaluator
{
public:
    string evaluate(string input);
};

但是,编译器抱怨:

Invalid arguments '
Candidates are:
? evaluate(?)
'

好像没有定义字符串。但是如果我将头文件的副本放在同一个文件夹下,错误就会消失。这是一个 Windows 盒子。我曾尝试使用 \ 并转义 \\ 作为路径分隔符,但它不起作用。

这听起来像 NDK(或它使用的任何预处理器)错误吗?我不想移动头文件,因为它会被其他项目共享。我也讨厌保留同一个文件的 2 个副本。

有什么想法吗?谢谢。

【问题讨论】:

  • 编译器投诉的其余部分在哪里?您没有在那里粘贴完整的错误。此外,您通常不会在 C++ 中传递字符串——而是传递一个 const string&,以防止过多的对象创建和复制构造函数调用
  • 我设法将错误减少到只有这个。
  • sInput 来自哪里? jInput 被传入,从你传入的部分错误消息中我能猜到的最好的结果是 sInput 不是正确的类型。
  • 它被声明为字符串。我进一步减少了代码,以便 Evaluator 类只有一个函数“void foo()”,它在 JNI 函数中被引用。它仍然无法正常工作。错误显示“无法解析方法 foo”。同样,如果我将头文件复制到同一文件夹下,它编译得很好。在这一点上,我很确定这是一个预处理器错误。
  • 愚蠢的问题,但你确定你的路径是正确的吗?您是否尝试过将该目录添加为 makefile 中构建的包含路径的一部分?

标签: android c++ eclipse android-ndk


【解决方案1】:

对不起,我没有 Windows 操作系统,但我在 MacOS 上试过你的代码,但它不起作用,因为:

string sInput(L"Hello world");

说 wchar_t 不能放在 std::string 上。有可能是同样的问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多