【发布时间】: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