Я очень новичок во всем этом Gradle и поддержке Android Studio. Мне удалось преобразовать мой проект Android в Gradle, используя опцию экспорта.
Но я ищу некоторую документацию или отправную точку, как интегрировать сборку NDK в процесс сборки gradle.
Если возможно, мне также нужен какой-то этап «после», который копирует двоичные файлы сборки (файлы .so) в каталог ресурсов.
android
android-ndk
gradle
android-studio
plaisthos
источник
источник
Ответы:
Мы выпустили первую версию интеграции в качестве предварительного просмотра в 1.3: http://tools.android.com/tech-docs/android-ndk-preview
Интеграция останется предварительным просмотром даже после того, как 1.3 станет окончательным. Нет текущего ETA относительно того, когда он будет окончательным (по состоянию на 2015/07/10).
Более подробная информация здесь: http://tools.android.com/tech-docs/android-ndk-preview
источник
ОБНОВЛЕНИЕ: Android Studio с поддержкой NDK уже не доступен: http://tools.android.com/tech-docs/android-ndk-preview
Для сборки с помощью скрипта должно работать следующее решение:
Я использую свой сценарий сборки и добавил его в свой файл (кажется, для работы
0.8+
): это, кажется, эквивалентно решению ниже (но выглядит лучше в файле Gradle):К сожалению, сборка не завершится ошибкой, если каталог отсутствует или не содержит
.so
файлов.источник
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }
. Спасибо ребята за помощь!jni.srcDirs = [] //disable automatic ndk-build
очень важна, поскольку она не позволяет Android Studio перестраивать исходный код C / C ++. Я пытался понять это в течение двух дней, пока я не увидел ваш пост, и это решило мою проблему. Я действительно думаю, что сборка NDK лучше собирать отдельно с помощью только make-файла командной строки Android.mk, а не сценария gradle, поскольку C / C ++ создавался Makefile уже более 40 лет!С обновлением 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/
Существенные моменты:
и поместите это в build.gradle вашего модуля:
Это процесс компиляции вашего кода 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 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, и он автоматически перекомпилирует все связанные библиотеки.
источник
В Google IO 2015 Google объявил о полной интеграции NDK в Android Studio 1.3.
Теперь он недоступен для предварительного просмотра и доступен всем: https://developer.android.com/studio/projects/add-native-code.html
Старый ответ: Gradle автоматически вызывает,
ndk-build
если у вас естьjni
каталог в источниках вашего проекта.Это работает на Android Studio 0.5.9 (канарейка).
Скачать НДК
Либо добавить
ANDROID_NDK_HOME
к вашей переменной окружения или добавитьndk.dir=/path/to/ndk
к вашемуlocal.properties
в проекте Android Studio. Это позволяет Android-студии автоматически запускать ndk.Загрузите последние примеры проектов Gradle, чтобы увидеть пример проекта ndk. (Они внизу страницы). Хороший пример проекта есть
ndkJniLib
.Скопируйте
gradle.build
из примеров проектов NDK. Это будет выглядеть примерно так. Этоgradle.build
создает разные apk для каждой архитектуры. Вы должны выбрать, какую архитектуру вы хотите использовать, используяbuild variants
панель.Обратите внимание, что это будет игнорировать ваши файлы Android.mk и Application.mk. В качестве обходного пути вы можете указать gradle отключить atuomatic вызов ndk-build, а затем вручную указать каталог для источников ndk.
Кроме того, вы, вероятно, захотите явно вызвать ndk-build в вашем скрипте сборки gradle, потому что вы просто отключили автоматический вызов.
источник
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
Я обнаружил, что «gradle 1.11 com.android.tools.build:gradle:0.9.+» теперь поддерживает предварительную сборку ndk, вы можете просто поместить * .so в dir src / main / jniLibs. при сборке gradle упакует ндк в нужное место.
вот мой проект
источник
Как сказал Ксавье, вы можете поместить свои предварительные сборки в / src / main / jniLibs /, если вы используете gradle 0.7.2+
взяты из: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
источник
На данный момент (Android Studio v0.8.6) все довольно просто. Вот шаги для создания приложения типа «Hello world»:
Загрузите Android NDK и поместите корневую папку где-нибудь в здравом уме - возможно, там же, где и папка SDK.
Добавьте следующее в ваш
local.properties
файл:ndk.dir=<path-to-ndk>
Добавьте следующее в свой файл build.gradle внутри
defaultConfig
замыкания сразу послеversionName
строки:ndk { moduleName="hello-world" }
В каталоге модуля приложения
main
создайте новую папку с именемjni
.В этой папке создайте файл с именем
hello-world.c
, которое вы видите ниже.Смотрите пример
Activity
кода ниже для примера того , как вызвать метод (или это функция?) Вhello-world.c
.hello-world.c
MainActivity.java
build.gradle
Найдите полный исходный код очень похожего приложения здесь (за исключением NDK).
источник
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI
на свой :)Если вы работаете в Unix, последняя версия (0.8) добавляет ndk-build. Вот как это добавить:
Он ожидает найти JNI в 'src / main / jni', в противном случае вы можете определить его с помощью:
Начиная с 28 января 2014 года с версией 0.8 сборка не работает на Windows, вы должны отключить сборку с помощью:
источник
Элегантный обходной путь показан в https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J .
По сути, вы создаете jar, который содержит «lib / armeabi / yourlib.so», а затем включаете jar в сборку.
источник
ndk-build
, генерирует.jar
s для каждого.so
и помещает их в путь сборки gradle, чтобы облегчить эту боль. Проверьте это.Хороший ответ, автоматизирующий упаковку готовых
.so
файлов, дан в другом (закрытом) потоке . Чтобы это работало, мне пришлось изменить строку:в:
Без этого изменения
.so
файлы не были найдены, поэтому задача их упаковки никогда не выполнялась бы.источник
Ответ от @plaisthos сломался в последней версии Gradle, но есть еще способ сделать это. Создайте
native-libs
каталог в корневом каталоге вашего проекта и скопируйте все эти библиотеки в этот каталог.Добавьте следующие строки в ваш build.gradle. Строй и будь счастлив.
источник
Это код, который я использую для сборки с помощью Android-ndk из Gradle. Для этого добавьте ndk путь к каталогу в
gradle.properties
ie. добавитьndkdir=/home/user/android-ndk-r9d
и поставить все JNI файлов в папкеnative
в ,src/main/
как вы можете видеть из кода размещены ниже. Это создаст банку с родными библиотеками, которые вы можете использовать как обычноSystem.loadLibrary("libraryname");
источник
Я использовал следующий код для компиляции собственных библиотек Dropbox, я использую Android Studio v1.1.
источник
Я использовал
ndk.dir=/usr/shareData/android-ndk-r11b
// путь ndkв файле local.properties в проекте android studio. и добавьте эту строку:
android.useDeprecatedNdk=true
в файле gradle.properties в проекте android studio.
Более подробная информация здесь: http://tools.android.com/tech-docs/android-ndk-preview
источник
Чтобы подробнее рассказать о том, что сказал Наксос (спасибо Наксосу за то, что он направил меня в правильном направлении!), Я многому научился из недавно выпущенных примеров NDK и разместил ответ на аналогичный вопрос здесь.
Как настроить NDK с помощью плагина Android Gradle 0.7
Этот пост содержит полную информацию о связывании встроенных библиотек в ваше приложение для различных архитектур, а также информацию о том, как добавить поддержку NDK непосредственно в сценарий build.gradle. По большей части вам больше не нужно обходить zip и копировать.
источник
Вот шаги, которые я использовал, чтобы заставить NDK работать в моем проекте Android Studio. Я использовал этот учебник, чтобы помочь мне https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio
Чтобы использовать NDK, вы должны добавить строку NDK в local.properties. Так что под свой sdk.dir добавь
В моих приложениях build.gradle у меня есть следующий код
moduleName - это имя, которое вы хотите дать своему собственному коду. Я верю, что так будет называться разделяемая библиотека. ldLibs позволяет мне войти в LogCat, stl - это stl, который вы хотите импортировать. Есть много вариантов, таких как Eclipse NDK. ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )
cFlags - все еще определенное количество черной магии для меня. Я не нашел хорошего источника для всех вариантов и того, что они дают мне. Ищите в StackOverflow все, что вам нужно, именно там я его и нашел. Я знаю, что c ++ 11 позволяет мне использовать новый стандарт c ++ 11.
Вот пример того, как я вхожу в LogCat из родного кода
источник
настроить проект в Android Studio из Eclipse: вы должны импортировать проект Eclipse ndk в Android Studio без экспорта в Gradle, и это работает, также вам нужно добавить путь ndk в local.properties , если показывает ошибку, затем добавьте
в build.gradle файл затем создать JNI папку и файл , используя терминал и запустить его будет работать
источник
Теперь, когда Android Studio находится в стабильном канале, довольно просто запустить образцы android-ndk . Эти примеры используют экспериментальный плагин ndk и являются более новыми, чем те, на которые есть ссылки в онлайн-документации Android NDK. Как только вы узнаете, что они работают, вы можете изучить файлы build.gradle, local.properties и gradle-wrapper.properties и соответствующим образом изменить свой проект. Ниже приведены шаги, чтобы заставить их работать.
Перейдите в раздел «Настройки», «Внешний вид и поведение», «Системные настройки», Android SDK, выберите вкладку «Инструменты SDK» и проверьте Android NDK версии 1.0.0 в нижней части списка. Это загрузит NDK.
Укажите местоположение недавно загруженного NDK. Обратите внимание, что он будет помещен в каталог sdk / ndk-bundle. Для этого выберите «Файл», «Структура проекта», «Расположение SDK» (слева) и укажите путь в разделе «Расположение Android NDK». Это добавит запись ndk в local.properties, подобную этой:
Таким образом, я успешно собрал и развернул все проекты в хранилище, кроме gles3gni, native-codec и builder. Я использую следующее:
Android Studio 1.3 build AI-141.2117773 Примеры
Android-ndk, опубликованные 28 июля 2015 г. (ссылка выше)
SDK Tools 24.3.3
NDK r10e, извлеченный в C: \ Android \ sdk \ ndk-bundle
Gradle 2.5
Gradle plugin 0.2.0
Windows 8.1 64 bit
источник
NDK Builds и Gradle (базовый уровень)
Как правило, сборка с использованием NDK так же проста, как и правильное указание пути ndkBuild к Android.mk или пути cmake к CMakeLists.txt. Я рекомендую CMake поверх более старого Android.mk, потому что поддержка C / C ++ в Android Studio основана на CLion и использует CMake в качестве формата проекта. По моему опыту, это привело к тому, что среда IDE стала более отзывчивой в более крупных проектах. Все скомпилированные в вашем проекте будут автоматически собраны и скопированы в APK.
Добавление готовых библиотек в проект (дополнительно)
Статические библиотеки (.a) в вашей сборке NDK будут автоматически включены, но предварительно встроенные динамические библиотеки (.so) должны быть размещены в
jniLibs
. Это можно настроить с помощьюsourceSets
, но вы должны принять стандарт. Вам НЕ НУЖНЫ никакие дополнительные командыbuild.gradle
при включении готовых библиотек.Макет
jniLibs
Вы можете найти более подробную информацию о структуре в Руководстве пользователя плагина Android Gradle .
Затем вы можете проверить полученный APK-файл, содержащий ваши файлы .so, как правило, в разделе
build/outputs/apk/
, используяunzip -l myApp.apk
список содержимого.Создание общих библиотек
Если вы создаете общую библиотеку в NDK, вам больше ничего не нужно делать. Он будет правильно упакован в APK.
источник
Просто добавьте эти строки в приложение
build.gradle
источник
сейчас. Я могу загрузить так успех!
1. добавить файл .so к этому пути
| --src | - | --основной | - | - | --java | - | - | --jniLibs | - | - | - | --armeabi | - | - | - | - | -. так файлы
2. добавить этот код в gradle.build
}
3.
System.loadLibrary("yousoname");
источник
Если ваш проект экспортирован из Eclipse, добавьте приведенные ниже коды в файл Gradle:
2. Если вы создаете проект в Android студии:
создайте папку с именем jniLibs в src / main / , и поместите файлы * .so в папку jniLibs.
И скопируйте код, как показано ниже в вашем файле Gradle:
источник
Хотя я считаю, что SJoshi (оракул) имеет наиболее полный ответ, проект SWIG - это особый случай, интересный и полезный, но не обобщенный для большинства проектов, которые хорошо справляются со стандартными проектами на основе муравьев SDK + NDK. Мы все хотели бы использовать Android studio сейчас, скорее всего, или хотеть более дружественный к CI инструментарий сборки для мобильных устройств, который теоретически предлагает gradle.
Я опубликовал свой подход, где-то позаимствовал (я нашел это на SO, но опубликовал суть приложения build.gradle: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ). В двух словах, я рекомендую следующее:
На мой взгляд, Gradle для Android был беспорядком, так же как мне нравятся заимствованные концепции maven и продуманная структура каталогов для проекта. Эта особенность NDK "скоро" уже более 3 лет.
источник