Android - проблемы с JNI - PullRequest
0 голосов
/ 31 мая 2019

У меня есть следующий код (хранится в виде файла .c) в моем проекте Android:

static void convert(unsigned int &c, const float &temp1, const float &temp2, const float &temp3) {
    if ( (temp3 * 6) < 1) c = (unsigned int) ((temp2 + (temp1 - temp2) * 6 * temp3) * 100);

    else if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100);

    else if ((temp3 * 3) < 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp3) * 6) * 100);

    else c = (unsigned int) (temp2 * 100);

    return;
}

Во время кода он вызывается так:

convert(r, temp1, temp2, temp3);

Но когда яскомпилируйте его с помощью команды ndk-build из командной строки, затем я получаю следующие ошибки:

Android NDK: APP_PLATFORM не установлено.По умолчанию минимально поддерживаемая версия Android-16.[Arm64-V8A] Compile: com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor <= com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c JNI / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 193: 47: ошибка: ожидается ')' статической силы новообращенного (беззнаковое INT & с, Const поплавка & TEMP1, Const плывут ... ^ JNI / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 193: 33: примечание: для сопоставления с этим '(' преобразованием статической пустоты (unsigned int & c, const float & temp1, const float ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 193: 47: ошибка: имя параметра опущено статическая пустотаconvert (без знака int & c, const float & temp1, const float ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 194: 11: ошибка: использование необъявленного идентификатора 'temp3' if ((temp3 * 6) <1) c = (без знака int) ((temp2 + (temp1 - temp2) * 6 * temp3 ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 194: 27: ошибка: использование необъявленного идентификатора 'c', если ((temp3 * 6) <1) c = (беззнаковое целое) ((temp2 + (temp1 - temp2) * 6 * temp3 ... ^jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 194: 57: ошибка: использование необъявленного идентификатора 'temp1' if ((temp3 * 6) <1) c = (без знака int) ((temp2 + (temp1 - temp2) * 6 * temp3 ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 194: 65: ошибка: использование необъявленного идентификатора 'temp2' if ((temp3 * 6) <1) c = (без знака int) ((temp2 + (temp1 - temp2) * 6 * temp3) * ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 194: 48: ошибка: использование необъявленного идентификатора 'temp2' if ((temp3 * 6) <1) c = (без знака int) ((temp2 + (temp1 - temp2)* 6 * temp3 ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 194: 78: ошибка: использование необъявленного идентификатора 'temp3' ... (temp3 * 6) <1) c = (unsigned int) ((temp2 + (temp1)- temp2) * 6 * temp3) * 100);^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 196: 15: ошибка: использование необъявленного идентификатора 'temp3' else if ((temp3 * 2) <1) c = (unsigned int) (temp1 * 100);^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 196: 31: ошибка: использование необъявленного идентификатора 'c', иначе if ((temp3 * 2) <1) c = (unsigned int) (temp1 * 100);^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 196: 51: ошибка: использование необъявленного идентификатора 'temp1' else if ((temp3 * 2) <1) c = (unsigned int) (temp1 * 100);^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 198: 15: ошибка: использование необъявленного идентификатора 'temp3' иначе, если ((temp3 * 3) <2) c = (без знака int) ((temp2 + (temp1 - temp2) * (.666...^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 198: 31: ошибка: использование необъявленного идентификатора 'c' else, если ((temp3 * 3) <2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.666... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 198: 61: ошибка: использование необъявленного идентификатора 'temp1' else if ((temp3 * 3) <2) c = (без знака int) ((temp2 + (temp1 - temp2) *(.666 ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 198: 69: ошибка: использование необъявленного идентификатора 'temp2' ... if ((temp3 * 3) <2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 198: 52: ошибка: использование необъявленного идентификатора 'temp2', в противном случае ((temp3 * 3) <2) c = (unsigned int)((temp2 + (temp1 - temp2) * (.666 ... ^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 198: 88: ошибка: использование необъявленного идентификатора 'temp3' ... <2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp3) * 6) * 100);^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 200: 10: ошибка: использование необъявленного идентификатора 'c', иначе c = (без знака int) (temp2 * 100);^ jni / com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 200: 30: ошибка: использование необъявленного идентификатора 'temp2', иначе c = (unsigned int) (temp2 * 100); </p>

Я получил этот код из .cppфайл.Когда я удаляю адресный оператор (&) в подписи, то все нормально (без ошибок), но я не знаю, будет ли тогда работать алгоритм.

Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вы пытаетесь скомпилировать код C ++ с помощью компилятора C, который не будет работать.

Очевидное решение состоит в том, чтобы вместо этого скомпилировать его с помощью компилятора C ++ (например, присвоив исходному файлу .cpp extension).

Если по какой-то причине вы должны использовать компилятор C, то вам придется переписать функцию на C.
Для начала вы можете передать все эти const float параметры по значениювместо ссылки (избавившись от &).Я не знаю, почему они были ссылками.
Этот первый параметр (c) используется в качестве выходного параметра, в который записывается результат.Поэтому вам придется изменить его со ссылки на указатель (например, unsigned int *c).Или, что еще лучше, пропустите выходной параметр и попросите функцию вернуть его результат:

static int convert(const float temp1, const float temp2, const float temp3) {
    unsigned int c;

    if ( (temp3 * 6) < 1) c = (unsigned int) ((temp2 + (temp1 - temp2) * 6 * temp3) * 100);
    else if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100);
    else if ((temp3 * 3) < 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp3) * 6) * 100);
    else c = (unsigned int) (temp2 * 100);

    return c;
}

Код вызова:

r = convert(temp1, temp2, temp3);
0 голосов
/ 31 мая 2019

В C ++ unsigned int &c является ссылочным параметром, а & не является «оператором адреса» в этом случае. Тем не менее, ссылки не существуют в C, поэтому вы получаете ошибки при компиляции этого кода C ++ в файле .c вместо .cpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...