Привет! Меня давно интересовал вопрос, насколько 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 со следующим содержимым:
Затем в этой же директории необходимо создать файл с настройками компиляции Android.mk. Подробное описание этого файла доступно здесь доки по Android.mk, но я приведу лишь минимум необходимого содержания для компиляции:
После подготовки simppleApp.c и Android.mk входим в директорию simpleApp через terminal и запускаем команду ndk-build:
Теперь в директории simpleApp появилась папка /libs/. В ней должны появиться поддиректории с исполняемыми файлами для разных платформ. Возьмем, например, файл для платформы arm из директории armeabi (подойдет для многих распространенных аппаратов) и скопируем его в реальный телефон в директорию /data/local/tmp с помощью adb и команды push:
Теперь заходим в устройство через терминал, переходим в директорию с нашим приложением simpleApp и запускаем его:
Отлично! Консольное приложение заработало, запросило ввод чисел и выдало правильный результат! Надеюсь, мои заметки помогут кому-то на первых шагах освоения инструмента Android NDK.
Для этого я освоил способ создания приложений на языке 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)
DeXPeriX
25.10.2016 12:59Мне для Winter Novel пришлось пойти ещё глубже — как теперь отобразить в Android результаты выполнения вот такого вот консольного приложения? В итоге на OpenGL написал свой почти эмулятор терминала… Зато весь Java-код (если он есть) лежит на плечах SDL. Моё же приложение написано на чистом Си.
pyra
Кому это интересно, то NDK это по сути обрезанный AOSP (исходники всего адроида), некоторые библиотеки под линукс не компилируются под NDK, но в AOSP их можно скомпилировать.
требования для компиляции AOSP
https://source.android.com/source/requirements.html винды нет вообще, что бы начать, надо скачать и скомпилировать, это может занять 3ое суток