Привет! Меня давно интересовал вопрос, насколько 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).

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

Теперь рассмотрим создание простейшего консольного сумматора двух целых чисел. Создадим директорию 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 = %d\n", a+b);
 return 0;
}

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

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.
Поделиться с друзьями
-->

Комментарии (2)


  1. pyra
    25.10.2016 12:20

    Кому это интересно, то NDK это по сути обрезанный AOSP (исходники всего адроида), некоторые библиотеки под линукс не компилируются под NDK, но в AOSP их можно скомпилировать.

    требования для компиляции AOSP
    https://source.android.com/source/requirements.html винды нет вообще, что бы начать, надо скачать и скомпилировать, это может занять 3ое суток


  1. DeXPeriX
    25.10.2016 12:59

    Мне для Winter Novel пришлось пойти ещё глубже — как теперь отобразить в Android результаты выполнения вот такого вот консольного приложения? В итоге на OpenGL написал свой почти эмулятор терминала… Зато весь Java-код (если он есть) лежит на плечах SDL. Моё же приложение написано на чистом Си.

    image