Вы когда нибудь хотели программировать на си/c++ на смартфоне или планшете? Я как только заполучил Android устройство сразу захотел иметь компилятор под рукой, чтобы можно было быстро что нибудь скомпилить или протестировать. Несмотря на отсутствие физической клавиатуры это удобно иметь возможность в нужный момент набросать программу вытянув телефон из кармана. В GooglePlay есть несколько компиляторов с графическим интерфейсом например C4Droid и даже полноценная среда разработки TerminalIDE, но хочется чего нибудь простого, такого как gcc в Linux. И это возможно. Установка gcc в Android вполне возможна если в вас есть рут права.

Можно конечно самому компилить gcc из исходников или скачать готовые файлы и закинуть их в /system/xbin но мы поступим по другому, воспользуемся пакетным менеджером BootBrew.

Установка BootBrew

Bootbrew можно скачать в GooglePlay или с форума 4pda. После установки запустите программу и Нажмите кнопку procced для загрузки данных и инициализации приложения:

После окончания инициализации можно приступать к установке GCC.

Установка gcc в Android

Сначала обновим список пакетов:

Затем останется найти gcc в списке пакетов и нажать кнопку install.

Если все прошло так то вы счастливчик. Но у многих и в том числе и у меня во время обновления списка пакетов возникает ошибка update failed. Как я понял это из-за того что программа работает не от суперпользователя и следовательно не имеет прав на запись необходимой информации. Поэтому тем кому не повезло для управления пакетами придется использовать консоль. И так откройте Terminal Emulator, только не говорите что у вас его еще нет 🙂 и набирайте следующие команды:

получаем права суперпользователя:

обновляем список пакетов:

Устанавливаем программу:

Вот и все, если надумаете удалить gcc наберите:

Посмотреть список всех доступных для установки пакетов можно командой:

Тестирование gcc

Наберите небольшую программу, например:

[sourcecode]

#include

[/sourcecode]

Сохраните в файле с именем main.c и наберите для компиляции:

В Android  можно выполнять только в определенных папках поэтому перемонтируйте /system/bin в режим чтения и скопируйте туда программу:

$ cp ./program /system/bin/

Дайте права на выполнение:

Выполните:

Работает!

Автор оригинала: 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-приложение. Попробуйте запустить его и сообщите нам, что оно делает. 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

ОСТАВЬТЕ ОТВЕТ

Please enter your name here
Please enter your comment!