Подтвердить что ты не робот

Использовать С++ с Android ndk/jni

Все образцы ndk используют только базовые функции C, объявленные как extern в заголовке и определенные в файле cpp. Затем после включения файла заголовка в файл C, содержащий обратный вызов jni, все работает нормально.

Можно ли использовать классы С++ с android ndk? Мое приложение не будет родным, оно все равно будет иметь важную часть java, но оно вызовет собственный C-код для вычисления с интенсивным использованием ЦП (уже написанный на С++, с классами и другими материалами на С++).

Вот мой привет-мир, как strcuture:

Файл "first.h"

#ifndef FIRST_H
#define FIRST_H

class Test
{};

#endif /* FIRST_H */

Файл "second.cpp"

#include <jni.h>
#include "first.h"

#ifdef __cplusplus
extern "C" {
#endif

jint Java_com_example_twolibs_TwoLibs_add( JNIEnv*  env,
                                      jobject  this,
                                      jint     x,
                                      jint     y )
{
    Test t;
    return 0;
}

#ifdef __cplusplus
}
#endif

И наконец, Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.cpp

include $(BUILD_SHARED_LIBRARY)

Довольно простой, но не компилируемый. Поворот second.cpp в .c файле вызывает ошибку при включении файла заголовка, я думаю, это потому, что это не файл С++.

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'

Выполняя это .cpp вызывает следующую ошибку:

make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'.  Stop.

Любая идея, как я могу скомпилировать эту вещь?

Спасибо

4b9b3361

Ответ 1

Вы можете использовать С++ с NDK, но файлы с кодом С++ должны иметь расширение .cpp.

От ANDROID-MK.html:

Обратите внимание, что расширение по умолчанию для исходных файлов С++ - ".cpp". это однако можно указать другое, указав переменную LOCAL_CPP_EXTENSION. Не забывайте, что начальная точка (т.е. ".cxx" будет работа, но не 'cxx').

Ответ 2

Вам придется перекомпилировать все родные библиотеки специально для Android. Вам нужен исходный код для всех сторонних родных библиотек, которые вы планируете использовать просто потому, что обычно, когда мы компилируем и связываем эти библиотеки за пределами Android, они связаны с glibc, но, к сожалению, Android не использует glibc из-за liscence и производительности вопросы. Android использует версию glibc с водяным охлаждением libc. Он имеет соответствующие имена символов для glibc для большинства обычных функций. Но насколько я знаю, libc не имеет некоторых функций, связанных с strings, и определенно не имеет поддержки posix. Если ваши собственные библиотеки используют любую устаревшую функциональность, вам придется найти обходное решение для них, используя альтернативные функции, поддерживаемые libc и соответствующим образом кодируя ваши библиотеки.

Кроме того, как вы правильно указали, вам придется использовать NDK для подключения Java (Android app/fwk) к родному миру (С++).

Хотя это очень просто в моем опыте, компиляция собственных библиотек на Android (портирование Android) традиционно занимала много времени, не гарантируя успеха.

Ответ 3

О вашей компиляционной ошибке кажется, что вы сначала назвали ее "second.c", а затем переименовали ее в "second.cpp", но в объектных файлах все еще есть имя "second.c", поэтому перед компиляцией (bdk -build) вам нужно удалить файлы *.o и *.d в/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/directory

Ответ 4

error: expected '=', ',', ';', 'asm' или '__ attribute __' перед 'классом'

Классический случай отсутствия ';' перед ключевым словом класса? Представьте себе,

 int functionname(int p)
 class X { } ;

Это может привести к легкому сообщению вашего компилятора. Общим сложным фактором является то, что на самом деле он выглядит как

 #include "someheader.h"
 class X { } ;

и ошибка находится в последнем объявлении внутри someheader.h/или в любом рекурсивно включенном файле/;)

Ответ 5

Run:

ndk-build clean

после изменения неправильного Android.mk, иначе сборка может продолжить сбой, даже если вы исправили конфигурацию.

Я думаю, что это то, что OP означало в этом комментарии.

Ответ 6

Изменить Android.mk

Измените экземпляры LOCAL_SRC_FILES и удалите./из начала каждой строки.