NDK не может справиться с #include с относительными путями?

#android #c #eclipse #android-ndk

#Android #c #затмение #android-ndk

Вопрос:

Я пишу приложение Adroid с некоторым кодом на C за пользовательским интерфейсом, используя Eclipse NDK (r8d). У меня есть некоторый код, который я считал надежным, но компилятор просто выдает мне странные ошибки, такие как «Недопустимые аргументы», без конкретики. Вот как выглядит мой код на 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 jResu<
    }
}
 

Оценщик.Двигатель.h — это не что-то особенное, а просто объявление оценщика класса.

 #include <string>
using namespace std;

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

Однако компилятор жалуется:

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

как будто строка не определена. Но если я помещу копию заголовочного файла в ту же папку, ошибка исчезнет. Это окно Windows. Я пробовал использовать и escape \ в качестве разделителей путей, но это не сработало.

Похоже ли это на ошибку NDK (или любого другого используемого им препроцессора)? Я не хочу перемещать файл заголовка, потому что он будет использоваться другими проектами. Я также ненавижу хранить 2 копии одного и того же файла.

Есть какие-нибудь идеи? Спасибо.

Комментарии:

1. Где остальная часть жалобы компилятора? Вы не вставили туда полную ошибку. Кроме того, вы обычно не передаете строки в C — вместо этого передайте const stringamp; , чтобы предотвратить создание избыточного объекта и вызов конструктора копирования

2. Мне удалось уменьшить количество ошибок только до этой.

3. Откуда берется sInput? Передан JInput, лучшее, что я могу предположить из сообщения о частичной ошибке, которое вы передали, это то, что sInput не является правильным типом.

4. Он объявлен как строка. Я еще больше сократил код, чтобы класс Evaluator не имел ничего, кроме функции «void foo ()», и на нее есть ссылка в функции JNI. Он все еще не работает. Ошибка гласит: «Метод foo не может быть разрешен». Опять же, если я скопирую файл заголовка в ту же папку, он нормально компилируется. На данный момент я почти уверен, что это ошибка препроцессора.

5. Глупый вопрос, но вы уверены, что ваш путь правильный? Вы пытались добавить этот каталог как часть пути включения для вашей сборки в свой makefile?

Ответ №1:

Извините, у меня нет ОС Windows, но я пробовал использовать ваш код на macOS, но он не работает из-за:

 string sInput(L"Hello world");
 

Говоря, что wchar_t нельзя поместить в std::string . Возможно ли быть такой же проблемой?