- PVSM.RU - https://www.pvsm.ru -

Создание консольного приложения с помощью Android NDK

Привет! Меня давно интересовал вопрос, насколько Android есть Linux и можно ли в нем запускать терминальные (консольные) приложения, минуя песочницу под названием Dalvik.

Для этого я освоил способ создания приложений на языке C/C++ для Android с использованием Android NDK. NDK позволяет создавать как библиотеки с native-методами (C/C++) для Java, так и исполняемые приложения для запуска из командной строки.

Здесь я расскажу, как сделать первые шаги быстро и просто. Заранее оговорюсь, что Android NDK для Windows — это неудобно, поэтому далее рассматриваются OSX и Linux. Виртуалка c Ubuntu в помощь!

Написанное рассчитано на тех, кто уже пробовал следующие действия:

1. Создавал hello world на C/C++;
2. Устанавливал и пробовал ADB, SDK.
3. Включал режим отладки на Android-смартфоне (Debug mode [1]).

Следующим шагом необходимо поставить на машину NDK и настроить переменные окружения. Рекомендую ставить не самую свежую версию ndk, так как с ней бывают глюки. Сам поставил ndk-r10d. Почитать инструкции здесь: Ubuntu and SDK [2] | NDK Getting Started [3] | Tools, ADB, SDK, NDK для mac [4].

Теперь рассмотрим создание простейшего консольного сумматора двух целых чисел. Создадим директорию simpleApp и поместим в ней поддиректорию jni. В jni необходимо создать файл с исходным кодом нашего приложения simpleApp.c со следующим содержимым:

#include <stdio.h>
int main() {
 int a,b;
 printf("Enter two numbers a and b: ");
 scanf("%d %d", &a, &b);
 printf("a+b = %dn", a+b);
 return 0;
}

Затем в этой же директории необходимо создать файл с настройками компиляции Android.mk. Подробное описание этого файла доступно здесь доки по Android.mk [5], но я приведу лишь минимум необходимого содержания для компиляции:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := simpleApp
LOCAL_SRC_FILES := simpleApp.c  #файл с исходниками
APP_ABI := armeabi #целевая платформа ARM (тип процессора в телефоне)
TARGET_ARCH_ABI := armeabi

include $(BUILD_EXECUTABLE) #тип компиляции - приложение или библиотека

После подготовки simppleApp.c и Android.mk входим в директорию simpleApp через terminal и запускаем команду ndk-build:


$ cd simpleApp/
simpleApp$ ndk-build 
[armeabi] Compile thumb  : simpleApp <= simpleApp.c
[armeabi] Executable     : simpleApp
[armeabi] Install        : simpleApp => libs/armeabi/simpleApp

Теперь в директории simpleApp появилась папка /libs/. В ней должны появиться поддиректории с исполняемыми файлами для разных платформ. Возьмем, например, файл для платформы arm из директории armeabi (подойдет для многих распространенных аппаратов) и скопируем его в реальный телефон в директорию /data/local/tmp с помощью adb и команды push:


simpleApp$ cd libs/armeabi/
armeabi$ adb push simpleApp /data/local/tmp
[100%] /data/local/tmp/simpleApp

Теперь заходим в устройство через терминал, переходим в директорию с нашим приложением simpleApp и запускаем его:


armeabi$ adb shell
shell@m3:/ $ cd /data/local/tmp
shell@m3:/data/local/tmp $ ./simpleApp                                         
Enter two numbers a and b: 6 3
a+b = 9

Отлично! Консольное приложение заработало, запросило ввод чисел и выдало правильный результат! Надеюсь, мои заметки помогут кому-то на первых шагах освоения инструмента Android NDK.

Автор: hakey

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/razrabotka-pod-android/202677

Ссылки в тексте:

[1] Debug mode: https://www.kingoapp.com/root-tutorials/how-to-enable-usb-debugging-mode-on-android.htm

[2] Ubuntu and SDK: http://askubuntu.com/questions/318246/complete-installation-guide-for-android-sdk-adt-bundle-on-ubuntu

[3] NDK Getting Started: https://developer.android.com/ndk/guides/index.html

[4] Tools, ADB, SDK, NDK для mac: https://wiki.appcelerator.org/display/community/Managing+the+Android+SDK+and+NDK+on+OSX+using+Homebrew

[5] доки по Android.mk: https://developer.android.com/ndk/guides/android_mk.html

[6] Источник: https://habrahabr.ru/post/313516/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox