Невозможно включить заголовки C ++, такие как вектор, в Android NDK


84

Когда я пытаюсь включить какой-либо класс C ++, например вектор, в мой проект Android NDK (с использованием последней версии NDK r5b), я получаю сообщение об ошибке следующего вида ...

Compile++ thumb : test-libstl <= test-libstl.cpp /Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory

Другие люди, которые сообщили об этой проблеме в Интернете, заявили об успехе, добавив

APP_STL := stlport_static

в свой файл Application.mk. Я сделал это, а также попробовал все возможные значения для APP_STL. Я очистил проект, запустил ndk-build clean, удалил папки obj и libs, и все же, когда я компилирую, он не может найти векторный класс. Я работал над этим уже несколько недель (с момента выхода NDK r5) и был бы очень признателен, если бы у кого-нибудь был совет. Благодаря!


2
Прежде всего проверьте каталог android-ndk-r5 \ build \ platform \ android- X\ arch-arm \ usr \ include - vectorдействительно ли там?
Сева Алексеев

2
Нет! Я мало что знаю о том, как работает NDK, помимо использования JNI и компиляции исходников. Как я могу заставить вектор быть там? Я вижу вектор в android-ndk-r5b / sources / cxx-stl / stlport / stlport, если это что-то значит. Спасибо за быстрый ответ, и я очень признателен!
Nitrex88

2
@seva Итак, я попытался запустить кучу инструментов для восстановления цепочки инструментов и предварительных сборок (файлы .sh в папке инструментов NDK), но все еще не мог заставить работать заголовки STL. Если я загружу NDK только что с сайта Android, не должно ли все работать? Я пробовал и свежая загрузка ничего не меняет. Вы могли бы предложить больше информации по этому вопросу?
Nitrex88 05

[вот как я настроил STLPort для работы с Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

[вот как я настроил STLPort для работы с Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Ответы:


121

Возможно. Вот несколько пошаговых инструкций:

В $ PROJECT_DIR / jni / Application.mk :

Я пробовал использовать stlport_shared, но безуспешно. То же самое с libstdc ++.

В $ PROJECT_DIR / jni / Android.mk :

Здесь ничего особенного, но убедитесь, что ваши файлы имеют формат .cpp .

В $ PROJECT_DIR / jni / hello-jni.cpp :

Единственное, что меня здесь укусило, это #ifdef __cplusplus.

Смотрите каталоги.

Для компиляции используйте ndk-build clean && ndk-build.


5
Спасибо Спасибо!! Вы наконец решили мою проблему. Оказывается, у меня Application.mk был не в том месте! У меня он был в папке проекта, но не в папке JNI (я не уверен, почему, но с тех пор, как я начал разработку Android, я всегда думал, что он попал туда). Увидев, что вы поместили путь к Application.mk в папку jni, я понял. Спасибо, и вы получите награду!
Nitrex88

2
Простое создание необходимого Application.mk решило эту проблему, но я вижу сообщение Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. ПРИМЕЧАНИЕ: это не сработало под cygwin
Someone Somewhere

привет, я могу создать приложение, использующее вектор.
CoDe

привет, я добавил APP_STL: = stlport_static в файл Application.mk, и он работает для моего приложения, но то же приложение, которое я включаю в Android Source, здесь выдает ошибку «векторный класс не найден ..» во время компиляции кода. Пожалуйста, предложите мне, чтобы у кого-нибудь было представление об этом.
CoDe

1
Возможно, вы можете загрузить образец своего проекта на github и поделиться URL-адресом, тогда мы могли бы взглянуть.
Себастьян Рот

20

Если вы используете Android studio и при компиляции с использованием ndk все еще видите сообщение «error: vector: No such file or directory» (или другие ошибки, связанные с stl), то это может вам помочь.

В своем проекте откройте файл build.gradle модуля (не build.grade вашего проекта, а тот, который предназначен для вашего модуля) и добавьте 'stl "stlport_shared"' в элемент ndk в defaultConfig.

Например:


1
Почему stlport_sharedи нет stlport_static?
Игорь Ганапольский

9

Я использую Android Studio, и по состоянию на 19 января 2016 года это помогло мне. (Кажется, что-то меняется каждый год или около того)

Перейдите в: приложение -> Сценарии Gradle -> build.gradle (Модуль: приложение)

Затем под моделью {... android.ndk {... и добавьте строку: stl = "gnustl_shared"

Как это:


Привет, у меня проблема с ffmpeg, на самом деле сборка ndk работает нормально, и она успешно генерирует файлы .so, но файлы заголовков отсутствуют, вы знаете об этом? (Я использую студию android с экспериментальным плагином
gradle

Это с экспериментальным плагином gradle?
Себастьян Рот

Почему gnustl_sharedвместо gnustl_static?
Игорь Ганапольский

Работает, я думаю, это следует выбрать в качестве ответа.
Vishnudev K

Я пробовал это с последней версией Android Studio 2.1.3, и, похоже, это не работает. Чтобы проверить это, я взял пример приложения HelloJNI, переименовал hello-jni.c в .cpp и добавил к нему #include <vector>. Я получаю сообщение об ошибке: необходимы fatal error: 'vector' file not found #include <vector>ли какие-либо дополнительные действия после добавления stl = "gnustl_static" или "gnustl_shared" в файл gradle модуля?
SideLobe 02

4

Даже Себастьян дал хороший ответ там еще 3 года назад, я все же хотел бы поделиться здесь новым опытом, на случай, если вы столкнетесь с той же проблемой, что и я, в новой версии ndk.

У меня есть ошибка компиляции, например:

Моя среда - android-ndk-r9d и adt-bundle-linux-x86_64-20140702. Я добавляю файл Application.mk в ту же папку jni и вставляю одну (и только одну) строку:

Но, к сожалению, мою проблему это не решает! Мне нужно добавить эти 3 строки в Android.mk, чтобы решить эту проблему:

Отсюда я увидел хороший обмен, в котором говорится, что «предпочтительнее 'stlport_shared'». Так что, возможно, лучше использовать stlport в качестве разделяемой библиотеки вместо статической. Просто добавьте следующие строки в Android.mk и не нужно добавлять файл Application.mk.

Надеюсь, это будет полезно.


Чтобы было ясно, когда вы говорите «та же папка jni», вы имеете в виду папку jni проекта Android? Я хочу убедиться, что нет другого места, о котором я должен знать. примечание стороны: эта хорошая ссылка для обмена сейчас мертва :(
Hunter-Orionnoir,

4

Позвольте мне добавить немного к ответу Себастьяна Рота.

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

Обратите внимание, что ваш проект необходимо преобразовать в проект C / C ++.

Как преобразовать проект C / C ++

Чтобы решить эту проблему, щелкните свой проект правой кнопкой мыши и выберите Свойства.

Выберите C / C ++ General -> Paths and Symbols и включите каталог${ANDROID_NDK}/sources/cxx-stl/stlport/stlport для включения.

Нажмите Да, когда появится диалоговое окно.

Диалог

До

До

После

После

Обновление # 1

GNU C. Добавить каталоги, перестроить. Там не будут какие - либо ошибки в C исходные файлы
GNU C ++. Добавляйте каталоги, перестраивайте. В исходных файлах CPP ошибок не будет .


3

Если вы используете ndk r10c или новее, просто добавьте APP_STL = c ++ _ static в Application.mk


1

Вот что вызвало проблему в моем случае ( CMakeLists.txt):

Он делает невидимыми все ранее определенные каталоги include. После удаления / рефакторинга этой строки все работает нормально.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.