Android JNI не находит файлы заголовков стандартной библиотеки C ++

Я следую руководству android-studio-jni и пытаюсь скомпилировать собственный код C ++ с помощью gradle. Все отлично работает: я могу загружать JNI-функцию, писать классы C ++, компилировать, запускать и отлаживать. И мне не нужно писать и поддерживать make- файлы Application.mk и Android.mk ; Оба они, по-видимому, обрабатываются градиентом неявно. Есть только одна вещь, которую я не понимаю: как включить файлы заголовков C ++ из стандартных библиотек?

Я думаю, что, должно быть, я пропустил что-то в сценарии градации, но я не могу найти хорошую ссылку о том, что добавить сюда. Вот сценарий:

android.ndk { moduleName = "hello-android-jni" // I tried adding the following, but nothing happens stl = "stlport_static" } 

И скриншоты, показывающие, что все заголовки std не видны.

Введите описание изображения здесь Введите описание изображения здесь

Есть вещи, которые нужно сделать, чтобы заставить его работать:

  • Измените расширение файла с .c на .cpp, чтобы ndk скомпилировал файл с g ++ вместо gcc.
  • Добавьте конфигурацию stl, такую ​​как stl = "stlport_static" , другие параметры – gnustl_static , system и т. Д. Я не пробовал их все, но я думаю, это не имеет большого значения, если вы используете некоторые базовые вещи, такие как std::string .

  • Нажмите кнопку синхронизации, как показано на скриншоте ниже. Получается, что даже если он говорит о завершении синхронизации, потребуется некоторое время, чтобы индексировать файл и найти заголовок из stl. Так что будьте терпеливы, не спешите. Будьте терпеливы, не спешите. Для меня это занимает примерно 10 секунд. Если вы не можете найти эту синхронизацию в строке меню, она также доступна в разделе Инструменты> Android> Sync Poroject с файлами Gradle .

    Введите описание изображения здесь

  • Наконец, обновите код до C ++ и проверьте его:

     #include <jni.h> #include <iostream> extern "C" { JNIEXPORT jstring JNICALL Java_com_yuchen_helloandroidjni_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance) { // TODO std::string message = "Hello World From Jni"; return env->NewStringUTF(message.c_str()); } } 

Теперь он должен работать без сбоев. Пойдите, родной, да!


Редактировать:

Я не знаю точно, что нам нужно, чтобы поставить код под extern "C" { ... } . Но, похоже, это важно, иначе у нас будет ошибка:

Java.lang.UnsatisfiedLinkError: реализация не найдена для void com.yuchen.helloandroidjni.getMsgFromJni () (попробовал Java_com_yuchen_helloandroidjni_MainActivity_getMsgFromJni)

Если кто-нибудь это объяснит.

 "your-path-to-ndk-bundle"\platforms\android-21\arch-arm\usr\include 

Я не вижу там iostream, поэтому вы не можете импортировать его. Вы можете попробовать добавить туда дополнительные библиотеки, а для других процессоров – папку.

Intereting Posts
Могу ли я встроить пользовательский шрифт в приложение для Android? Использование Google Analytics в Android-приложении с активностью пользовательского интерфейса и бесконечным фоновым сервисом Как сделать салфетки клавиатуры, как приложение Не удалось преобразовать формат Dalvik: невозможно выполнить SDX-инструменты dex 22.3 FIPS Compliance и BouncyCastle Приложение Chromecast Sender не обнаруживает разъединение / повторное соединение Заменить комментарий java с протоколированием во время или до выполнения Уведомление об отзыве магазина Android Play Тип org.andengine.entity.shape.IAreaShape не может быть разрешен. StateListDrawable не работает Ошибки компиляции с использованием ActionbarSherlock в студии android 0.3.1 Как отфильтровать только соответствующие мультимедийные файлы в Android? Okhttp всегда повторяет неудачное соединение Сохранение предварительного просмотра во время записи видео? Не удалось установить apk в эмулятор android