26 Октября 2017 1 338 В первой части — введении, обсудим роль NDK и причины его использования для разработки под Android. Продвинуть свой проект —>
Android NDK.
Для разработки под Android, помимо SDK (Standart Development Kit) разработчику доступен инструмент под названием NDK (Native Development Kit), который позволяет использовать язык С++ для написания отдельных модулей приложения.
Архитектура ОС Android и роль NDK.
Операционную систему Android можно разделить на логические части — компоненты. На данный момент эти компоненты:
- Linux Kernel — ядро операционной системы Android
- Hardware Abstraction Level (HAL) — уровень, на котором реализуется интерфейс между hardware устройства и более высокими уровнями системы, такими как
- Native C/C++ Libraries — уровень библиотек Android, на котором, в частности, основывается компонент ART. Здесь расположены, например, библиотеки для работы с графикой и звуком.
- Android Runtime (ART) — среда исполнения байт-кода в операционной системе Android.
- Java API Framework — набор модулей и компонентов для реализации приложений в Android.
- System apps — приложения, написанные прикладными разработчиками.
Большинство приложений пишутся с использованием SDK. В этом случае код компилируется в специальный байт-код, который исполняется в ART. Такой подход позволяет не зависеть от архитектуры процессоров, на которых будет выполняться ваше приложение, однако это накладывает отпечаток на производительность и скорость выполнения кода. (Причины этого общедоступны, но это не тема данной статьи).
При использовании NDK, разработчику предоставляется возможность создавать и интегрировать в проект модули, написанные на С/С++, в том числе и ранее написанные библиотеки. При этом, код, написанный на С++, будет компилироваться в машинный код и исполняться нативно, т.е. в обход ART. Это позволяет увеличить производительность системы в тех ситуациях, где это является критичным, например при необходимости производить сложные расчеты, такие как в работе с графикой.
Необходимость использования NDK.
На данный момент, инструмент SDK предоставляет все необходимые средства для написания приложения под Android. В силу этого, нет никакой необходимости использовать С/С++ в повседневной работе. В большинстве случаев это не требуется, потому что при правильном подходе, производительности, которую обеспечивает ART будет достаточно. Однако его NDK незаменим в таких ситуациях как:
- Работа с графикой и звуком
- Использование сторонних библиотек
- Низкоуровневая разработка — все, что выходит за рамки ART
Заключение
В этой части статьи мы рассмотрели краткое описание сути NDK, его роли при разработке в Android и причин его использования. В следующей части, рассмотрим практический пример подключения и использования C/C++ в Android. До новых встреч!
—
Александр Чех
CTO MobileDev
Monodroid и Monotouch это фреймворки от xamarin, которые дают возможность разрабатывать приложение на языке C# для Android и iOS соответственно. Так как это относительно новая технология информации в интернете не слишком много (за исключением офф сайта и большого количества тем на stackoverflow.com), на русском языке же я не нашел никаких туториалов и информации вообще. Что бы устранить это недоразумение решил написать небольшой туториал о том как начать разрабатывать приложения под мобильные платформы при помощи этих фреймворков. В этой статье я рассмотрю только Monodroid. Что нужно для начала разработки? 1) Visual studio C# версии professional и выше (пойдет и крякнутая) 2) Сам фреймворк (а он, в свою очередь установит за нас и джаву, и виртуальную машину и все остальное) Если с первым все понятно, то со вторым сложнее- как оказалось в процессе использования фришная версия монодроида не умеет компилировать .apk файлы, так что стоит либо его купить, либо воспользоваться кряком из интернета (который лежит далеко не на первой странице гугла).Начнем Запустив после установки всего необходимого студию мы заметим новые типы проектов для создания: Выбираем Android Application. Будет создано несколько стандартных директорий: В папке Assets хранятся все используемые программой файлы аля видео, звуков, хтмл файлов и т.д. Изначально в ней ничего нет кроме текстовика с описанием самой директории и для чего она нужна. В папке Drawable нужно размещать файлы изображений, используемые программой. Папка Layout содержит файлы графического интерфейса. В папке Values различные параметры, которые можно создавать и загружать при работе приложения (к примеру можно запомнить логин и пароль туда). После создания пустого проекта мы можем его скомпилировать, нажав F5 — откроется настройки виртуальной машины с выбором устройства на котором запускать тест программы. Если подсоединить свой девайс на андроиде со включенной функцией отладки по USB (это в настройках, вкладка «для разработчика») то можно запустить и потестить непосредственно на нем. Очень советую проводить тесты на реальном устройстве т.к. многие тач элементы нельзя протестировать на виртуалке, к тому же, лично у меня на виртуальной машине приложение развертывается довольно долго. Между компиляцией и запуском на виртуалке проходит около минуты. По умолчанию мы имеем кнопку, при нажатии на которую будет выведено сколько раз мы кликнули по оной. Попробуем сделать что-нибудь поинтереснее. Откроем файл интерфейса и попробуем его поменять. Снизу 2 вкладки- просмотр кода интерфейса и самого интерфейса. Справа- различные компоненты. Сразу скажу: пользоваться встроенной формоклепалкой это не для слабонервных. Она на столько лагуча и делает не то, что ожидаешь что просто ужас. Вместо этого можно пользоваться сайтом droiddraw.org после составления интерфейс там и нажатие на кнопку Generate можно скопипастить код во вкладку кода и все будет ок. А в прочем, самый лучший способ это создавать интерфейс из кода, посредством формул исходя из соотношений разрешения экрана. Без этого нормальный интерфейс, привлекательно смотрящийся на всех экранах создать сложно. Однако, пока пойдем по простому пути. Есть несколько типов расположения объектов на экране- типов слоев. При этом многие из них могут содержать друг друга и уживаться вместе. Рассмотрим из них: 1) LinearLayout — каждый элемент ниже предыдущего. 2) RelativeLayout — каждый элемент находится по отношению к предыдущему (к примеру, можно задать параметр находиться слева от кнопки1, снизу от текстбокса, в отступе в 40 пикселей снизу от кнопки 2 и т.д. Настройки каждого компонента у нас в окне свойств- все довольно привычно, а сами свойства схожи с винформ элементами. Создав более или менее привлекательный интерфейс его надо как то запустить. Для этого существует Activity. По умолчанию у нас файл с названием Activity1, в котором класс- наследник от класса Activity. Строка над объявлением класса- [Activity(Label = «AndroidApplication1», MainLauncher = true, Icon = «@drawable/icon»)] описывает заголовок окна приложения, иконку и узнает запускать ли эту активити при запуске приложения. Из основной автозапускаемой активити можно запустить любую другую. После автозагрузки данной активити после старта приложения мы загружаем интерфейс строкой SetContentView(Resource.Layout.Main); Для получения доступа к любому элементу мы должны воспользоваться функцией FindViewById(); при присвоении экземпляру класса таго элемента, который нам нужен. Конкретно в нашем примере мы видим строчку FindViewById(Resource.Id.MyButton); «MyButton» это название кнопки, посмотреть его можно при создании интерфейса во вкладке код. Посредством простой конструкции Button button = FindViewById(Resource.Id.MyButton); мы можем работать с кнопкой и обрабатывать все действия с ней. В данном случае обработчик клика выглядит так: button.Click += delegate { button.Text = string.Format(«{0} clicks!», count++); }; Спроектировав и написав приложение мы моем скомпилировать apk файл посредством перехода во вкладку построение и нажатии кнопки Package for android. В папке проекта появится 2 файла, один из которых подписан автоматической подписью- его мы и можем использовать для установки па устройство. На этом, думаю, этот краткий туториал можно закончить. В будущем скорее всего напишу подобный туториал по портированию и разработке на iOS. 420 231.6k 420 3 года назад
Всем привет! Недавно видел на пабликах типа ТП посты мол «делаем игру жизнь на java за час», «делаем игру жизнь на python за час», вот решил сделать пост, делаем игру жизнь под андроид используя C++ и библиотеки Qt за час.
Важно отметить что игра занимает ~100 строчек кода(исключая h файлы, символы переноса и т.п.), а также то, что созданная игра будет работать и под винду, и под андроид, и под линукс, и под ios и под mac os x.В
И так начнем. Правила игры жизнь я думаю вы знаете. Есть поле с клетками. Клетка может быть живая или мертвая. По прошествии хода, если вокруг мертвой клетки есть 3 живых, она становится живой. Если вокруг живой клетки будет 1 или 0 живых, то она становится мертвой, также она становится мертвой если вокруг нее более 3 живых клеток. Впринципе все, подробнее вы можете прочесть на википедии.
И так что у нас должно быть:
1. GUI.В
Поле с N*M клеток, кнопка «Новая игра», кнопка «Начать эволюцию». Поле забито прямогуольниками, изначально все пустые. При нажатии на клетку она окрашивается в черный или белый цвет, в зависимости от того какой цвет был там раньше.
2. Логика. Мы должны иметь двумерный массив(используем QT’шный вектор), в котором 0 отмечена мертвая клетка а единицей живая клетка. У меня была цель создать игру примерно за час, и поэтому этот 0 и 1 соответствуют черному и белому цветам многоугольников. Соответственно у нас есть массив с указателями на наши прямоугольники. Это не хорошо, ибо логика должна быть отделена от GUI, но для уменьшения размера кода — решил сделать так.
Должны быть реализованы функции подсчета соседей для каждой из клеток, зная положение клетки по X и Y. После каждого хода, мы рассчитываем количество соседей для каждой из клеток, и в зависимости от состояния клетки и количества её соседей добавляем клетку в массив(вектор), для изменения её состояния. Если за 1 ход не было добавлено ни 1 клетки, то игра заканчивается, выводим пользователю количество ходов
Если вы не знакомы с наследованием и библиотекой STD в C++, то вы являетесь новичком в C++ и возможно код покажется вам запутанным. К сожалению не хотелось бы писать про все это в этом посте, ибо для новичков информации в интернете — тонны, а переписывать еще раз это — просто не зачем. Если вы с этим знакомы, но незнакомы с сигнально-слотовой системой Qt тоже порекомендую прочитать over9000 материалов по этой теме. Если потребуются пояснения я отвечу в комментах.
И так, как выглядит GUI:
Скачиваем Qt Creator с официального сайта Qt(qt.io), выбираем бесплатный вариант для GPL приложений. Запускаемся, создаем новый проект, используя QWidget, с графической формой
Переходим к созданию. Переходим в режим дизайн и добавляем на форму «Graphics View» и 2 Push Button. Примерно вот так как на следующей картинке, и кликая правой кнопкой мыши по форме выбираем (Скомпоновать по сетке)
GUI готово! Теперь нам нужно перейти к непосредственно программированию.
QGraphicsView — это виджет, который может отображать графические элементы. QGraphicsView отображает элементы, который расположены на QScene. На QScene мы размешаем элементы в декартовой системе координат, а с помощью QGrahicsView мы её отображаем(можно поворачивать, увеличивать масштаб и т.п.).
Элементы бывают разных типов. Есть простые — QGraphicsRectItem — это многоугольник, который к слову нам и понадобиться. Есть QGraphicsPixMapItem который отобразит нам изображение. ЕстьВ QGraphicsLineItem — это линия. И другие.В
И так, первая задача. Разместить на сцене N*M QGraphicsRectItem’ов — наших клеток. Мертвой клеткой будет считаться клетка, с Kletka->brush().color() == Qt::white живой Kletka-> brush().color() ==В Qt::black. И запихнуть все указатели наВ QGraphicsRectItem в отдельный двумерный вектор, чтобы мы могли с ними работать.
Однако, для этой задачи нам не подойдет «чистый»В QGraphicsRectItem. Нужно будет создать класс наследник, и в нем реализовать свою обработку нажатия на клетку. Ведь в самом начале игры нам нужно будет выставить первичные мертвые и живые клетки на поле.
Т.е. по нажатию на наш прямоугольник, он должен окрашиваться в требуемый цвет. А у чистого QGraphicsRectItem обработка данного события пустая.
Создадим класс LifeRect основанный на QGraphicsRectItrem., и переопределим в немВ mousePressEvent
Теперь займемся реализацией. Конструктор будет использовать конструктор с такими же параметрами как у QGraphicsRectItem(позиция по x, позиция по y, широта, высота, родитель). В событии mousePressEvent будет вызываться функция changeColor.
Реализация liferect.c
И так, переходим дальше. Работаем с нашим виджетом(формой) — В widget.c. В этом классе реализуется логика игры.
Что нам необходимо?
1. Таймер. Каждые 0.1 секунды будет происходить 1 ход.
2. Слоты нажатия на кнопку «Старт» и «Новая игра» соответственно.
3. Размеры поля — X и Y клеток. Принимаются через конструктор.
4. Переменная для хранения количества итераций(для вывода при завершении игры)
5. Двумерный вектор(используется QVector, а не std::vector) который хранит указатели на созданные нами LifeRect’ы. К его элементам мы будем обращаться, и будем представлять живое и мертвое состояние по его цвету, как я уже и писал ранее. Если среди читателей будут новички C++ в комментах могу помочь. Просто представляйте что это массив.
6. Функция для новой игры(обнуление поля, обнуления количества итераций).
7. Функция подсчета живых соседей рядом.
И так, начнем. Собственно вот заголовочный файл:
В конструкторе присвоим начальные данные(x,y из входных, 0 итераций, укажем то что сцена пока-что пустая, родительский элемент отсутствует. Проинициализируем таймер, но запускать его не будем
Создать слот on_pushButton нужно нажав правой кнопкой по кнопке на форме, выбрать перейти к слоту, и выбрать сигнал clicked()
Дальше — интереснее. И так, по нажатию на кнопку новая игра, мы должны нарисовать графическую сцену, с X*Y мертвыми многоугольниками, и наполнить двумерный вектор указателей на многоугольники ими же. Чтобы потом,когда игрок заполнит поле и нажмет на В кнопку «СТАРТ» запускается таймер, по каждому тику таймера обходить этот вектор, вычислить количество живых соседей каждой клетки, и перерисовать требуемые.
Постарался максимально прокомментировать код.В
К слову говоря, позиции осей X и Y в графической сцене таковы:
И так, мы прорисовали свои элементы, и уже можем потыкать и поменять их цвета, но пока-что не можем ничего запустить. Нужно реализовать функцию обработки каждого хода. И написать что по 2 кнопке мы запускаем таймер.
Осталось лишь только реализовать функцию подсчета соседей. Думаю, в ней проблем не будет. Мы просто смотрим на цвета наших 8 соседей(если вылезли за границы то перемещаемся в начало или конец соответственно) и выдаем на выход их количество
Все готово! Запускаем и играем на Linux, Windows или вашем Mac.
Что потребуется(если вкратце) для запуска на Android?
1. Пакеты Android SDK и Android NDK(для C++).
2. Устройство андроид или AVD.
3. Apache Ant.
Вы должны сконфигурировать ваш Qt Creator, в таком виде(ваши пути), и добавить в проектах сборку Android. Потребуется скачать в AVD драйвера USB, и API требуемых версий Android. Затем уже попробовать установить приложение на телефон/эмулятор. Я могу помочь, или привести ссылки где это подробно разбирается в комментах
Пробуем на стареньком LG Optimus One с Android 2.3.3. — все работает как часы и на старых андроидфонах. К слову говоря можете попробывать как все выглядет в реальности(перед созданием) по ссылке -В https://play.google.com/store/apps/details?id=com.mousemove…. (без рекламы и прочего, как собрал так и залил)
Исходники -В https://cloud.mail.ru/public/AsLq/4y4hufCQ7
Автор оригинала: Richard A.
- Перевод
- Tutorial
На момент написания этого текста текущей версией Android Studio была версия 1.0.1. Компилятор Intel C++ Compiler for Android, будучи частью Intel Integrated Native Developer Experience (Intel INDE), поддерживает Android Studio 1.0.1 в Intel INDE 2015 Update 1. Поскольку Android Studio 1.0.1 не поддерживает Android NDK, в этой статье описаны шаги для создания нативного Android-приложения с использованием Android NDK r10d и компилятора Intel C++ Compiler for Android. Поехали! Android Studio в качестве системы сборки использует Gradle. На момент написания статьи Gradle в процессе сборки вызывала систему NDK. В Android NDK r10 и более поздней версии после инсталляции Intel INDE компилятор Intel C++ Compiler for Android (ICC) не является более используемым по умолчанию компилятором в системе сборки NDK. Представленные ниже шаги дают общее описание подготовки, сборки и выполнения нативного приложения в Android Studio 1.0.1. Если вы используете Android Studio 0.8.6, почитайте статью «Сборка нативных Android-приложений с использованием компилятора Intel C++ Compiler в Android Studio», где рассказывается о применении Intel C++ Compiler.
Содержание
Требуемые программные инструменты
Успешная инсталляция INDE 2015 Update 1 с Android Studio Integration гарантирует, что вы располагаете всем необходимым программным обеспечением. Детальные требования к программному обеспечению и системе описаны в документе Intel C++ Compiler Release Notes for Intel Integrated Native Developer Experience 2015. Приведенные в данной статье инструкции предполагают использование следующего ПО для архитектуры IA-32 и Intel-64:
- Oracle JDK 7 (нативный Intel-64 JDK для систем Windows x64)
- Android SDK 20 или старше
- NDK r10d (предполагается инсталляция в [ndk-dir] )
- Android Studio 1.0.1
Убедитесь, что в переменную среды PATH добавлены следующие директории Android NDK (если они отсутствуют, добавьте):
- C:IntelINDEIDEintegrationNDKbuildtools
- C:IntelINDEIDEintegrationNDK
Использование компилятора Intel C++ Compiler в Android Studio 1.0.1
После инсталляции Intel C++ Compiler 15.0 for Android в папку «[ndk-dir]toolchains» (директория по умолчанию – «C:IntelINDEIDEintegrationandroid-ndk-r10dtoolchains») устанавливаются следующие элементы:
- x86-icc
- x86-icc15.0.X.YYY
- x86_64-icc (если NDK поддерживает 64-разрядные цели)
- x86_64-icc15.0.X.YYY (если NDK поддерживает 64-разрядные цели)
Для NDK до r9d: после инсталляции нативным компилятором C/C++ будет Intel C++ Compiler. Дополнительных шагов для использования Intel C++ Compiler с Android Studio не требуется. Ели вы хотите для построения нативного кода использовать GNU gc, следуйте инструкциям в «Замена компилятора по умолчанию с Intel C++ Compiler на GCC для целевых приложений x86».Для NDK r10 — r10d: компилятор Intel C++ после инсталляции не является компилятором по умолчанию. Чтобы использовать Intel C++ Compiler из Android Studio, следуйте шагам 3, 4, 5 ниже. Если у вас установлено несколько Android NDK, следуйте инструкциям в статье «Интеграция Intel C++ Compiler for Android с несколькими Android NDK». Теперь создадим новый проект Android для Intel-64 с нативным вызовом функции, продемонстрировав тем самым использование компилятора Intel C++ Compiler:
1. Создание нового проекта Android с нативным интерфейсом:
1. Откройте Android Studio, создайте новый Android-проект «nativeDemo» с параметрами по умолчанию, например: 2. Откройте «appsrcmainjavaMainActivity.java» и добавьте в конец класса «MainActivity» нативную функцию как показано ниже:
public native String getStringFromNative();
Должно получиться примерно так:3. Чтобы создать проект «nativeDemo», выберите: «Build > Make Project», после чего можно будет использовать «javah».4. В «View > Tools Windows > Terminal» откройте терминальное окно и выполните указанные ниже шаги для запуска «javah» и создания заголовка jni: a) В терминальном окне перейдите в подпапку «srcmain»:
cd srcmain
b) Чтобы создать «com_example_nativedemo_app_MainActivit.h» в папке srcmainjni, выполните следующую команду «javah» cmd:
javah -d .jni -classpath C:IntelINDEIDEintegrationandroid-sdk-windowsplatformsandroid-21android.jar;....buildintermediatesclassesdebug com.example.mydemo.nativedemo.MainActivity
Пример:5. В окне Project измените вид на Project, щелкните правой кнопкой мыши на папке «src» и выберите «Synchronize ‘src». Теперь в папке «srcmainjni» можно видеть файл заголовка «com_example_mydemo_nativedemo_MainActivity.h».
2. Добавление нативного исходного кода: main.c
1. Создайте «main.c»: выделите файл «com_example_mydemo_nativedemo_MainActivity.h», используйте волшебные клавиши copy/paste для создания нового «main.c» со следующим кодом:
#include "com_example_mydemo_nativedemo_MainActivity.h" JNIEXPORT jstring JNICALL Java_com_example_mydemo_nativedemo_MainActivity_getStringFromNative (JNIEnv * env, jobject obj) { #ifdef __INTEL_COMPILER_UPDATE return (*env)->NewStringUTF(env, "Hello from Intel C++ !"); #else return (*env)->NewStringUTF(env, "Hello from default C++ !"); #endif }
2. Сохраните изменения3. Теперь в папке «jni» у вас два файла: com_example_mydemo_nativedemo_MainActivity.h и main.c
3. Добавление make-файла: Android.mk
1. Щелкните правой кнопкой на папке «jni», выберите «New > File»2. Наберите «Android.mk» и щёлкните на «OK»3. Добавьте в этот файл следующие строки (обратите внимание, что строка LOCAL_SRC_FILES должна содержать исходные файлы, которые находятся в папке «jni»):
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := nativeDemo LOCAL_SRC_FILES := main.c include $(BUILD_SHARED_LIBRARY)
4. Добавление make-файла: Application.mk
1. Щелкните правой кнопкой на папке «jni», выберите «New > File»2. Наберите «Application.mk» и щёлкните на «OK»3. Добавьте в этот файл следующие строки:
# For IA-32 #APP_ABI:=x86 #NDK_TOOLCHAIN:=x86-icc #include $(BUILD_SHARED_LIBRARY) # For Intel-64 APP_ABI:=x86_64 NDK_TOOLCHAIN:=x86_64-icc include $(BUILD_SHARED_LIBRARY)
4. [Опционально] Для изменения параметров компилятора используйте следующее:
APP_CFLAGS := -O3
5. Сконфигурируйте свое приложение для выполнения ndk-build с помощью make-файлов
1. Откройте файл «appbuild.gradle» 2. Добавьте в начало файла следующий импорт:
import com.android.build.gradle.tasks.NdkCompile import org.apache.tools.ant.taskdefs.condition.Os
3. И эти строки после секции «defaultConfig»:
sourceSets.main { jniLibs.srcDir 'src/main/libs' //set .so files location to libs } tasks.withType(NdkCompile) { // disable automatic ndk-build call compileTask -> compileTask.enabled = false } task ndkBuild(type: Exec) { // call ndk-build(.cmd) script if (Os.isFamily(Os.FAMILY_WINDOWS)) { commandLine 'cmd', '/c', 'ndk-build.cmd', '-C', file('src/main').absolutePath } else { commandLine 'ndk-build', '-C', file('src/main').absolutePath } } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild }
4. А следующие строки – в конец файла:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
5. Сохраните изменения6. Теперь создадим проект: выберите [Build > Make Project]. Вы увидите все выходные папки и файлы «libmain.so» в папках «mainlibs» и «mainobjlocal».
6. Добавьте ID «hello_textview» в виджет textview
Откройте «reslayoutactivity_main.xml» и измените виджет «textview» как показано ниже:
7. Обновите «MainActivity.java», чтобы UI textview вызов нативной библиотеки:
public class MainActivity extends Activity { static { // load the native library "nativeDemo" System.loadLibrary("nativeDemo"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // get the text string from native API, and display on the UI TextView tv = (TextView)findViewById(R.id.hello_textview); tv.setText(this.getStringFromNative()); }
Для импорта виджета TextView и сохранения изменений нажмите ALT+Enter.
8. Запустите виртуальную машину Android Virtual Machine «Intel-Nexus 7 x64» и выполните приложение, щёлкнув кнопку «Run».
Это означает, что был использован компилятор Intel C++ Compiler for Android.
The end
Теперь вы знаете, как с помощью Intel C++ Compiler в Android Studio создать нативное Android-приложение. Попробуйте запустить его и сообщите нам, что оно делает. Asked10 years, 5 months ago Active2 months ago Viewed 313k times 282
I’m trying to develop/port a game to Android, but it’s in C, and Android supports Java, but I’m sure there must be a way to get a C app on there, anyone knows of a way to accomplish this?
|improve this question
20 Answers 20
active oldest votes 244
For anyone coming to this via Google, note that starting from SDK 1.6 Android now has an official native SDK.
You can download the Android NDK (Native Development Kit) from here: https://developer.android.com/ndk/downloads/index.html
Also there is an blog post about the NDK:http://android-developers.blogspot.com/2009/06/introducing-android-15-ndk-release-1.html
|improve this answer 41
The Android NDK is a toolset that lets you implement parts of your app in native code, using languages such as C and C++. For certain types of apps, this can help you reuse code libraries written in those languages.
For more info on how to get started with native development, follow this link.
Sample applications can be found here.
|improve this answer 19
Normally, you have to:
- Install Google Android NDK. It contains libs, headers, makfile examples and gcc toolchain
- Build an executable from your C code for ARM, optimize and link it with provided libs if required
- Connect to a phone using provided adb interface and test your executable
If you are looking to sell an app:
- Build a library from your C code
- Create simple Java code which will use this library
- Embed this library into application package file
- Test your app
- Sell it or distribute it for free
|improve this answer 14
Google has released a Native Development Kit (NDK) (according to http://www.youtube.com/watch?v=Z5whfaLH1-E at 00:07:30).
Hopefully the information will be updated on the google groups page (http://groups.google.com/group/android-ndk), as it says it hasn’t been released yet.
I’m not sure where to get a simple download for it, but I’ve heard that you can get a copy of the NDK from Google’s Git repository under the donut branch.
|improve this answer 12
The official position seems to be that this isn’t something you’d ever «want to do». See this thread on the Android Developers list. Google envisage android running on a variety of different devices (CPUs, displays, etc). The best way to enable development is therefore to use (portable) managed code that targets the Dalvik VM. For this reason, the Android SDK doesn’t support C/C++.
BUT, take a look at this page:
Android includes a set of C/C++ libraries used by various components of the Android system. These capabilities are exposed to developers through the Android application framework.
The managed application framework appears to be layered on-top of these libraries. The page goes on to list the C/C++ libs: standard C library, media, 3D, SQL lite, and others.
So all you need is a compiler chain that will compile C/C++ to the appropriate CPU (ARM, in the case of the G1). Some brief instructions on how to do this are here.
What I don’t know is where to find descriptions of the APIs that these libraries provide. I’d guess there may be header files buried in the SDK somewhere, but documentation may be sketchy/missing. But I think it can be done!
Hope thats useful. For the record, I haven’t written any native android apps — just a few simple managed ones.
Andy
|improve this answer 8
You can use nestedvm to translate C (or other GCC languages) into Java bytecode, and use that as the basis of your port. For example, see the Android port of Simon Tathams portable puzzle collection.
I expect this method is made obsolete by the NDK, but it might not be in if some networks or something don’t allow people to upgrade their phones.
|improve this answer 8
Google has already launched Google I/O 2011: Bringing C and C++ Games to Android session which is available at http://www.youtube.com/watch?v=5yorhsSPFG4
which is good to understand the use of NDK for writing application in c and c++ for android.
If you just want to cross compile any console based native game and run them on android then this Article has shown 3 methods for the same.
1: Static compilation using standalone toolchain
2: Cross compilation using Android NDK’s toolchain
3: Cross compilation using AOSP source code
|improve this answer 7
Maybe you are looking for this?
http://www.mosync.com/
It is a middle layer for developing for several mobile platforms using c++.
|improve this answer 7
Looking at this it seems it is possible:
- http://openhandsetmagazine.com/2007/11/running-c-native-applications-on-android-the-final-point/ (now only available via the WayBack Machine)
«the fact is only Java language is supported doesn’t mean that you cannot develop applications in other languages. This have been proved by many developers, hackers and experts in application development for mobile. The guys at Elements Interactive B.V., the company behind Edgelib library, succeeded to run native C++ applications on the Android platform, even that at this time there is still many issues on display and sound … etc. This include the S-Tris2 game and a 3D animation demo of Edgelib.»
|improve this answer 6
Since 2009 there is a development on this matter.Necessitas — Qt(C++ framework) for Android Getting started video.
|improve this answer 5
Take a look at google ndk group it looks promising, first version of the NDK will be available in 1H2009.
Update: And it is released http://android-developers.blogspot.com/2009/06/introducing-android-15-ndk-release-1.html
|improve this answer 5
I’m not sure the NDK provides full coverage of the official Java API.
From http://developer.android.com/sdk/ndk/index.html#overview :
Please note that the NDK does not enable you to develop native-only applications. Android’s primary runtime remains the Dalvik virtual machine.
|improve this answer 3
Google just released the NDK which allows exactly that.
http://feedproxy.google.com/~r/blogspot/hsDu/~3/2foWz7hwFtE/introducing-android-15-ndk-release-1.html
It can be found here: http://developer.android.com/sdk/ndk/1.5_r1/index.html
|improve this answer 2
This blog post may be a good start: http://benno.id.au/blog/2007/11/13/android-native-apps Unfortunately, lots of the important stuff is «left as an exercise to the reader».
|improve this answer 2
I do not know a tutorial but a good development tool: Airplay SDK from Ideaworks Labs. (Recently rebranded «Marmelade») Using C/C++ you can build apps for Windows Mobile, iPhones, Android. The only component I didn’t like was the GUI composer — a buggy one, but you always can substitute it with the Notepad.
|improve this answer 2
You can download c4droid and then install the GCC plugin and install to your SD. From the shell I just traverse to the directory where the GCC binary is and then call it to make an on board executable.
/mnt/sdcard/Android/data/com.n0n3m4.droidc/files/gcc/bin/arm-linux-androideabi-gcc
#include int main(){ printf("hello arm!n"); return 0; }
hello arm!
|improve this answer 2
This three steps are good to have and store in this post.
1) How to port native c code on android
2) http://www.integratingstuff.com/2010/12/12/calling-native-c-code-through-jni-in-android-applications/
3) http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/
|improve this answer 2
Native C/c++ Files libstdc++.* from your Ubuntu are x86 (or x86_64) binaries but Android devices and emulators are ARM. Of course, this will not work anyway, even if you’ll set correct soname. This is very naive way which leads nowhere. Android has very limited support of C++ meaning there is no exceptions, standard C++ library (including STL) and RTTI. If you need such functionality, use my custom NDK distribution from
http://crystax.net/android/ndk.php — it support full C++ features listed above.
Why is there error: undefined reference to ‘__cxa_end_cleanup’ link error. Android stlport
time. Because there is no link to libstdc + +. A. So wrong.
Because it uses some static library, it is necessary to link the full libstdc + +. A. Can
http://crystax.net/android/ndk.php here to download the package
sources cxx-stl gnu-libstdc + + libs armeabi directory.
Android on its own libstdc + + support is limited, it must be linked to a complete libstdc + +. A the job.
Add file in Android.mk LOCAL_LDFLAGS = $ (LOCAL_PATH) / libs / libcurl.a
$ (LOCAL_PATH) / libs / liblua.a `$ (LOCAL_PATH) / libs / libstdc + +. A`
And LOCAL_CPPFLAGS + =-lstdc + +-fexceptions
can be compiled
|improve this answer 1
There is a plan to allow C/C++ libraries in the next SDK version of Android (Codename Eclair?)To date, it’s not possible through the Android Java SDK. However, you can grab the HUGE open source project, roll your own libraries, and then flash your own device…but anyone who wants to use your library will have to flash your custom build as well.
|improve this answer -7
Short answer: You can’t.
@Backslash17: Looking through the article and the following link with installation instructions, all the company got working is to launch a self compiled executable on the emulator, bypassing the android framework. Once you have the emulator you can telnet in and have a linux shell. Running a linux program there is trivial of course. But that’s not working for phones without jailbreak(aka root access) and not deliverable on the market.
Unless Google opens other opportunities or someone writes a custom compiler that compiles Language X into Dalvik bytecode (Dalvik is the VM that runs Android programs) you won’t be able to write native code.
|improve this answer
Not the answer you're looking for? Browse other questions tagged or ask your own question.
default
- https://spark.ru/startup/mobiledev/blog/33292/s-v-android-chast-1-vvedenie
- https://m.habr.com/post/169467/
- https://pikabu.ru/story/pishem_igru_zhizn_pod_android_ispolzuya_c_i_qt_za_chas_3926549
- https://habr.com/post/260003/
- https://stackoverflow.com/questions/1002164/write-applications-in-c-or-c-for-android