С обновлением Android Studio до версии 1.0 поддержка набора инструментов NDK значительно улучшилась ( обратите внимание: пожалуйста, прочтите мои обновления в нижней части этого поста, чтобы узнать, как использовать новый экспериментальный плагин Gradle и Android Studio 1.5 ).
Android Studio и NDK достаточно хорошо интегрированы, так что вам просто нужно создать блок ndk {} в build.gradle вашего модуля и установить исходные файлы в каталог (module) / src / main / jni - и вы сделано!
Нет больше ndk-build из командной строки.
Я написал все об этом в своем блоге здесь: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Существенные моменты:
Здесь нужно знать две вещи. По умолчанию, если у вас есть внешние библиотеки, которые вы хотите загрузить в приложение Android, они по умолчанию ищутся в (module) / src / main / jniLibs. Вы можете изменить это, используя параметр sourceSets.main.jniLibs.srcDirs в build.gradle вашего модуля. Вам понадобится подкаталог с библиотеками для каждой целевой архитектуры (например, x86, arm, mips, arm64-v8a и т. Д.)
Код, который вы хотите скомпилировать по умолчанию с помощью цепочки инструментов NDK, будет расположен в (module) / src / main / jni и, как и выше, вы можете изменить его, установив sourceSets.main.jni.srcDirs в build.gradle вашего модуля.
и поместите это в build.gradle вашего модуля:
ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
Это процесс компиляции вашего кода C ++, оттуда вам нужно загрузить его и создать обертки - но, судя по вашему вопросу, вы уже знаете, как все это сделать, поэтому я не буду повторно хэшировать.
Кроме того, я разместил репозиторий Github этого примера здесь: http://github.com/sureshjoshi/android-ndk-swig-example
ОБНОВЛЕНИЕ: 14 июня 2015 г.
Когда выйдет Android Studio 1.3, должна быть улучшена поддержка C ++ через плагин JetBrains CLion. В настоящее время я предполагаю, что это позволит разрабатывать Java и C ++ из Android Studio; однако я думаю, что нам все еще нужно будет использовать раздел Gradle NDK, как я уже говорил выше. Кроме того, я думаю, что все еще будет необходимость писать файлы-оболочки Java <-> C ++, если только CLion не сделает это автоматически.
ОБНОВЛЕНИЕ: 5 января 2016 г.
Я обновил свой блог и репозиторий Github (в ветке разработки) для использования Android Studio 1.5 с последним экспериментальным плагином Gradle (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
http://github.com/sureshjoshi/android-ndk-swig-example
Сборка Gradle для раздела NDK теперь выглядит следующим образом:
android.ndk {
moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
cppFlags.add("-fexceptions")
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}
Кроме того, довольно удивительно, что Android Studio имеет автозаполнение для C ++ - сгенерированные Java обертки, использующие ключевое слово «native»:
Тем не менее, это не совсем радужно ... Если вы используете SWIG, чтобы обернуть библиотеку для автоматической генерации кода, а затем попытаетесь использовать автогенерацию нативного ключевого слова, он поместит код не в том месте в вашем Swig _wrap Файл .cxx ... Так что вам нужно переместить его в блок "extern C":
ОБНОВЛЕНИЕ: 15 октября 2017 г.
Я был бы упущен, если бы не упомянул, что Android Studio 2.2 и выше имеет по существу «нативную» (без каламбура) поддержку для цепочки инструментов NDK через Gradle и CMake. Теперь, когда вы создаете новый проект, просто выберите поддержку C ++, и все готово.
Вам все еще нужно будет сгенерировать свой собственный код слоя JNI или использовать технику SWIG, о которой я упоминал выше, но поддержка C ++ в проекте Android теперь тривиальна.
Изменения в файле CMakeLists (где вы размещаете исходные файлы C ++) будут обнаружены Android Studio, и он автоматически перекомпилирует все связанные библиотеки.