Какой лучший язык для графического программирования в реальном времени на Android? - PullRequest
10 голосов
/ 16 июня 2011

Гугл заставил меня поверить, что C ++ является лучшим языком для программирования 2D-графики в реальном времени, но, поскольку Android основан на Java, это все еще лучший вариант? Или нам факт, что я должен использовать NDK, чтобы замедлить его или что-то? В моей программе также много научных вычислений, и я знаю, что C ++ для этого лучше / быстрее ...

Я никогда ничего не делал с Android раньше, поэтому сейчас я действительно беспомощен. Если я просто ошибаюсь, пожалуйста, дайте мне другие предложения ... Некоторые другие слова, с которыми я столкнулся, - это OpenGL (с которым у меня есть опыт, но это больше для 3D, верно?) И Canvas (не вполне понимаю) Если бы я мог получить доступ к GPU-подобным возможностям, это было бы здорово.

Ответы [ 3 ]

15 голосов
/ 16 июня 2011

Приложения Android написаны на Java, да - однако Android NDK позволяет вам писать критические для производительности разделы вашей программы на C или C ++.С веб-сайта Android NDK ,

Android NDK - это сопутствующий инструмент для Android SDK, который позволяет создавать критически важные для производительности части ваших приложений в собственном коде.Он предоставляет заголовки и библиотеки, которые позволяют вам создавать действия, обрабатывать пользовательский ввод, использовать аппаратные датчики, получать доступ к ресурсам приложений и т. Д. При программировании на C или C ++.

Тем не менее, используя NDK надлежащим образомСкорее всего не замедлит вашу программу.

OpenGL работает для 3D и 2D-графики - если вы заинтересованы только в 2D, вы захотите взглянуть на использованиеОртогональная проекция - см. glOrtho для получения дополнительной информации.С другой стороны, Android Canvas - это метод Java для рисования растровой графики на экране.Это позволит вам визуализировать 2D-графику, но с более медленной скоростью (и с частыми перерывами в сборщике мусора Android).

Имейте в виду, что если вы хотите использовать C ++, на момент написания, нет STLреализация доступна.Однако существуют неофициальные порты, которые предоставляют большую часть функциональности. STLPort - это тот, который я попробовал с некоторым успехом.Основная причина перемещения кода на C / C ++ заключается в прерывании работы сборщика мусора Java на Android - если вы не слишком осторожны с кодом, он будет часто прерывать вашу программу, чтобы очистить оставленные вами объекты.На практике это может резко ограничить частоту кадров игры или симуляции.

При всем этом я настоятельно рекомендую вам взглянуть на один из немногих движков с открытым исходным кодом для Android-игр, которые появляются.Лучшее, что я пробовал, это libGDX .Он позаботится обо всех беспорядочных деталях NDK и позволит вам кодировать вашу игру / симуляцию исключительно на Java.Он автоматически запускает части игрового движка с высокой производительностью в собственном коде, чтобы получить максимально быструю производительность с простотой кодирования на Java.Лучше всего, вы можете написать свой код приложения один раз и автоматически запускать его на Windows, Linux, OSX и Android - что значительно упрощает тестирование ваших приложений, чем использование эмулятора Android.

Если вы действительно хотитеДля того, чтобы самостоятельно изучить NDK или у вас должен быть действительно хороший контроль над тем, что делает OpenGL, я бы порекомендовал вам загрузить Android SDK и NDK, настроить Eclipse, а затем начать с примерами NDK.Там есть демонстрация OpenGL, которая показывает вам, как все настроить.Другой хорошей отправной точкой был бы проект Google SpinningCube .

РЕДАКТИРОВАТЬ: Я не совсем уверен, что вы подразумеваете под «возможностями, подобными GPU», но с libGDX вы можете скомпилироватьвершинные и фрагментные шейдеры в OpenGL ES 2.0 - вы можете использовать это для запуска смущающе параллельного кода с помощью графического процессора устройства.

6 голосов
/ 16 июня 2011

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

Преждевременная оптимизация - корень все зло - Кнут

1 голос
/ 28 ноября 2017

Как это сделать: Руководство C-программистов по Java и JNI в Android

Хороший вопрос, я задался, как полтора года назад, мне показалось очень неприятным.Я очень чувствую к тебе!

И из-за этого мне нравится давать ответ на руки.

Но посмотрите, это легко, если вы будете следовать этому руководству шаг за шагом (у вас будет намного меньше борьбы).Я это сделал.

Изучив это, вы в кратчайшие сроки научитесь легко писать Java Netbeans GUI с приложениями JNI (для любой другой ОС), также вы находитесь в мире разработки JNI для Java GUI?

Основа«Очень хорошо знаю C / C ++, совсем не знаю программирования на Java или Android, например, из культуры Win32 SDK и создав первое приложение для Android».

Графический интерфейс Android - это Java - вы должны указать

Дело в том, что графический интерфейс Android - это Java.Java, как ваше приложение, так и приложение на практике является частью среды GUI / OS, полностью интегрированной и постоянно вызывающей код Java GUI SDK.Отладчик даже входит в исходный код Java GUI SDK (кажется, что он уходит с дороги, что очень странно для программиста Win32 SDK).

Короче говоря, писать приложения для Android нельзя, кроме Java.

Но в любом случае это довольно просто, у вас есть JNI

Есть три очень хороших сочетания клавиш:

  • Библиотека примеров Android (очень богатая),особенно важен пример Hello JNI
  • Тот факт, что Java синтаксис очень похож на C / C ++ (но сильно отличается по своей сути, читайте ниже, вы должны понимать)
  • Вы получиливозможность C-кода JNI при выполнении тяжелой работы (и большая часть кода)

Вы должны написать небольшой пользовательский интерфейс Java Android GUI для своего приложения (с помощью образцов форм) иосновная часть JNI, где вы пишете свой C / C ++ - код, выполняющий всю работу.

Начните с примера программы Hello JNI

Установите Java и Android Studio и все, что вам нужно в инструментах (доступны в Win10, OSX или Ubuntu, они одинаковые).

  • Запустите Android Studio, и ее общее изображение - это меню, выберите самое низкое, Импортируйте образец кода Android.
  • Основной пример программы для традиционного программиста на C / C ++ - Hello JNI.Выберите его и скажите рядом со всем.
  • Откроется редактор Android Studio с примером кода (несколько раз жует, сначала увидите строку состояния с низким уровнем).

Справа вы (возможно, потребуется нажать на вкладку Android, чтобы) увидеть содержимое вашего проекта Hello JNI, приложение.Он состоит из:

  • Манифестов (объявление приложения, сегодня второстепенное значение, потому что большинство теперь находится в объявлениях скрипта Gradle (ниже))
  • Вкладка Java для файлов Java
  • Cpp-tab для ваших файлов C-кода
  • Ресурсы (тексты, меню и значки)
  • Скрипты Gradle-компиляции
  • C-make-files

Студия Android может попросить вас обновить установочный плагин, скажите «да» всем, пока это не будет сделано (см. Строку состояния ниже).

Затем запустите образец кода Hello JNI, чтобы убедиться, что с вашей установкой все в порядке

Нажав зеленую стрелку на зубчатом колесе (середина вверху).

Вы получаете диалоговое окно.Здесь вы можете попробовать пример:

  • Физическое устройство Android (через кабель от вашего ПК, возможно, потребуется драйвер Samsung win от их поддержки)
  • A HAXMЭмулятор Android-модуля (хорошо работает)

    Но вам нужно отключить функцию Hyper-V (используется для эмуляции XP) в Win10, чтобы он работал.Android Studio может сделать это автоматически по вашему запросу, иначе панель управления / Программы и функции / Функции Windows.

    Выберите Создать новое виртуальное устройство.Возможно, вам придется больше обновлять установочный плагин, скажите «да» всем.

Когда на устройстве работает приложение Hello JNI, у вас установлена ​​ОК.

C-код, проверьте hello-jni.c

Look в cpp-папке Up right) и вы найдете C-файл с функцией.

Здесь и в любом другом C-файле вы можете заполнить его обычным C-кодом.

Поддерживается все, кроме функций локали ANSI C (необходимо получить данные локали из Java и перенести их в C-среду).

Вам нужно отредактировать файл CMakeLists.txt, чтобы добавить любые дополнительные C / C ++ - файлы (это make-файл, смотрите справа под скриптами Gradle).

Кучи памяти, Java с JNI и C разные

Вы должны знать, что вечные строки данных, доставляемые интерфейсом JNI, находятся в куче памяти Java. Это также имеет место после того, как данные были доставлены в C-формате JNI.

Вы будете иметь затруднения, если не будете копировать строковые данные (и массивы) из кучи Java в C-кучу. Создайте базовую функцию, подобную этой, для копирования данных и выпуска данных JNI:

char *GetStringfromJniString(JNIEnv *env, jstring jniString)
{
    const char *TempString = (*env)->GetStringUTFChars(env, jniString, 0);
    char *String = calloc(strlen(TempString) + 1, sizeof(char));
    strcpy(String, TempString);
    (*env)->ReleaseStringUTFChars(env, jniString, TempString);
    return String;
}

Когда вы отправляете данные в jstrings Java, вам нужно поместить их в транспорт JNI с помощью

return (*env)->NewStringUTF(env, pCstring);

Длинные смешные названия JNI-функций

Имя функции: Java_com_example_hellojni_HelloJni stringFromJNI (…).

  • Там всегда есть «Ява»
  • com_example_hellojni означает, что он взаимодействует с вашим приложением в Java-пакете com.example.hellojni Java (читайте об этом в руководстве)
  • HelloJni - это имя файла Java, в котором объявлена ​​функция JNI
  • И stringFromJNI (…) - это фактическое имя функции (функции в Java называются методами).

Если с именами все в порядке, объявлением JNI-функций C в файле Java является черный текст, если не красный текст. (Дайте ему шанс, он непрерывно хранит и проверяет код в среде Java, может потребоваться несколько секунд, чтобы убедиться, что он правильный (становится черным).

Вы должны объявить JNI-функции C в java

В файле Java здесь HelloJni.java JNI-функции должны быть объявлены как методы Java (функции в Java).

public native String stringFromJNI(…); 

Где возвращаемые значения и переключатели функций / методов такие же, как в C. После этого вы можете использовать JNI-функции в качестве методов Java, так как они объявлены в объявлении Java. Обратите внимание, что char * - это строка в Java.

Константы должны быть объявлены с обеих сторон

#define CONSTANT_A = 24

Находится на Java

static final int CONSTANT_A = 24;

И вы можете использовать их в Java и в C, как обычно.

если (! Переменная) не работает в Java

Вам нужно сделать

if(variable==0)

Испытайте другие образцы

Библиотека сэмплов полна полностью функционирующих примеров Java. Попробуйте их один за другим, пока не найдете пользовательский интерфейс, который вам нравится. На самом деле приятно тестировать образцы.

В Github много примеров, но многие из них нуждаются в исправлениях скриптов Gradle или взяты из Eclipse (в прошлой среде Android-разработки), и их труднее пробовать (часто нужны исправления). Другие примеры Github - это просто фрагменты и много работы, чтобы заставить их работать. Конечно, ничего для звезды Java Android, но мы еще не там. Но Github очень хороший, еще больший источник сэмплов.

Скопируйте содержимое Java в ваш Hello-JNI

Нашли что-нибудь хорошее, скопируйте!

Воровство всегда платит, как это делал Дж.С. Бах! Довольно просто скопировать материал из одного образца в другой. При копировании в Android Studio, Android Studio автоматически добавляет включения (спрашивает сначала) и просто принимает. Иногда он делает это с просьбой ввести Alt-Enter, сделайте это.

Редактирование нескольких проектов одновременно

Файл / Открыть недавний - Собственная команда windows, позволяющая вам одновременно запускать два проекта, что упрощает копирование материалов между ними.

Создание собственного приложения

После некоторого тестирования вы создаете собственное приложение. Перейти кстандартное изображение студии Android (файл / закрыть проект), выберите «Начать новый проект студии Android». Поместите ваши данные в дерево пакетов (подумайте об этом, прочитайте об этом в руководстве) и создайте их. Затем скопируйте проверенный материал в свое приложение.

Изучай Java, урок Android-разработчика действительно хорош

Теперь вы сделали свою среду работоспособной и заметили несколько хороших пользовательских интерфейсов, изучайте Java!

Учебник по Android Studio действительно хорош. Попробуйте, и вскоре после нескольких уроков вы сможете играть с кодом Java, и очень скоро вы станете программистом на Java.

Застревая, Google, и вы найдете большинство ответов в Stackoverflow, просто поиск.

Вы никогда не первый с проблемой, и Stackoverflow действительно хорош. Прочитайте все ответы и подумайте, вы найдете то, что подходит вам лучше всего.

Среда Java и ОС Android сильно отличаются от Windows

Вам нужно чувствовать культуру и окружающую среду. Как и швед, приезжающий в Норвегию, вкус одной и той же еды немного отличается, даже если он выглядит одинаково.

Основным отличием является то, что в Java ничего не происходит так же хорошо, как в чистом C в среде C. Поиск ошибок может быть адом из-за непоследовательного сбоя. Программа продолжает работать и вылетает позже, но вы найдете ошибки.

Существуют файлы журналов Java для отладки, но для их проникновения требуется немало усилий. Как изучение ассемблерного кода в отладчике Windows.

Хорошая идея - сначала отладить C-код в чистой C-среде и обрабатывать Java-компоненты в Android Studio.

  • Я могу изменить C-код в Android Studio, но написание большого фрагмента C-кода действительно требует отладки. Подобно тому, как просить норвежца приготовить шведский ужин, невозможно понять его правильно, выглядит одинаково, но на вкус по-другому. Нет ничего плохого, кроме другой культуры.

Стиль мягкого сбоя Java включает в себя даже такие функции безопасности, как try / catchy / finally. (Вы должны зайти в Google и прочитать об этом сами. Это невероятно для хардкорного программиста C, но это реально.)

В Java нет h-файлов и переключателей # if-compiler

Вместо h-файлов и общих объявлений функций / переменных, как в C в java, вы должны ссылаться на них с именем файла, за которым следуют точка и имя метода, используя их из другого файла.

Если к объявленным закрытым переменным и методам можно получить доступ только из одного и того же файла, с public можно использовать ссылку на файл. Статика - это нечто совсем другое в Java.

Компилятор # if-переключателей не существует, поэтому вам нужно использовать обычные переменные / константы (для констант, поставленных перед финалом в объявлении).

В Java нет указателей, но есть строки

В Java нет указателей, но переменная String (и массив) на самом деле является указателем на символ

Но вы не можете обрабатывать указатели как в C с * и &, но в JNI вы, конечно, можете. Управление памятью совершенно другое, в Java ничего не исправлено.

Вам не нужно освобождать данные, Java стирает все для вас

Java очищает неиспользуемые данные автоматически.

Вы не освобождаете данные, просто удаляете (= 0;) строку- «указатели» или просто оставляете метод (функцию Java), и он очищает его.

Так что, если у вас есть строковый указатель и просто замените его чем-то другим, старый материал будет автоматически удален.

Среда Java живет своей жизнью, но отладчик студии Android включает в себя монитор используемых данных.

Ограничения по размеру Java-приложений и кода JNI

Полезно знать, что существуют некоторые ограничения в том, насколько большим может быть Java-приложение (но, как обычно, ничего не написано на камне в Java), но куча JNI может быть такой же большой, как HW.

НоВы не одиноки в телефоне, может поступить входящий звонок, и вы не хотите это испортить?Если вы хорошо очистите, это больше шансов, что ваше приложение не пострадает, вернувшись к нему и не будет убит.

Приложения Android не умирают при выходе

Если вы выходите из приложения, оно все еще работает, даже если графический интерфейс пользователя отсутствует (как в Macintosh).Дело в том, что вы должны знать об этом, читайте об этом, если вы делаете серьезные приложения.

Android убивает приложения

Но, с другой стороны, вы никогда не сможете поверить, что приложение не стерто с ОС, и вам придется его перестраивать.Если ОС нужна память, она просто начинает убивать приложения.Но часть JNI обычно выживает, и вы можете хранить там данные для восстановления.

Существует только один экземпляр JNI (термин WinSDK), но может быть много экземпляров Java

И все они подключаются к одному и тому же JNI одновременно.Только один экземпляр приложения может быть активным (показан), но другие могут выполнять фоновые задачи.В JNI вы должны отслеживать их.

Обычно в каждом приложении есть только один экземпляр Android.Но если вы запускаете приложение из рабочих файлов, например, из почтового клиента, у вас фактически есть другой экземпляр приложения (со своей собственной памятью и всем остальным (кроме JNI, который есть только в одном общем экземпляре)).

При запуске добавленного файла будет два или более экземпляров Android.Каждый связан с каждым экземпляром электронной почты, с помощью процедур намерений (узнайте о намерениях в учебнике по Android).

Умная вещь - отслеживать экземпляры по нумерации их при создании приложения, если saveInstanceState == null.

Копировать данные в эмулируемый модуль

Возможно, вам потребуется загрузить некоторые данные для тестирования вашего приложения.В обычном телефоне вы просто подключаете USB-кабель и входите в память телефона из проводника Windows.С эмулируемыми модулями вы должны использовать функциональность сценария adb-терминала (может использоваться в bat-файлах в Windows, а копирование bat-файла выглядит следующим образом:

PATH=%PATH%;C:\Users\You\AppData\Local\Android\sdk\platform-tools
adb push C:\Users\You\Documents\v.txt /storage/emulated/0/Android/data/com.yours.app/files/v.txt

Очень ограниченные привилегии для чтения и записи файлов

Суть в том, что вам разрешено открывать только собственные файлы, сохраненные вашим приложением на эмулируемой SD-карте. Иначе ничего не читается.

Используйте стандартные файловые функции ANSI C, а не Java

Лучше всего в приложении C-heavy использовать стандартные функции C-файла, поскольку вы привыкли к ним как к C-программисту и их поведению.

Функции C-файла работают нормально ипроще получить двоичный код или прозрачные текстовые файлы с символами ctrl и т. д. (Не допускается в строках Java, но в битовых массивах Java). Если вы попробуете это, потратьте немного усилий на изучение обработки файлов Java.

Производительность JNI отсутствуетПроблема

C-код намного быстрее, чем Java-код, поэтому многие разработчики не из C-культуры должны создавать JNI-функции и чистый C-кодвыступать в тяжелых приложениях, нуждающихся в производительности.Короче говоря, производительность JNI не проблема.

Однако у меня сложилось впечатление, что графический интерфейс Android во многих случаях быстрее графического интерфейса WinSDK.Работая с ListViews и иногда очень длинными списками, Android намного лучше оптимизирован.Похоже, WinSDK загружает каждую строку списка, а Android - только строки визуальные, и в длинных списках это имеет огромное значение.

Я впечатлен производительностью в Android даже с крошечными процессорами ARM.Приложения работают очень хорошо.Устройства Intel Android действительно хороши по производительности.Я без колебаний попытаюсь сделать приложение для Android с большим напряжением, пока я использую JNI.Не подходит по сравнению с Windows.

Но обратите внимание, что при запуске HAXM на ПК Intel эмулируемые модули Intel работают намного быстрее, чем ARM, чем в реальных HW-модулях, потому что он выполняет код Intel прямо, а не на уровне эмулятора, как с эмулируемыми модулями ARM,

Я поражен тем, что Android x86 не продается тяжелее, чем конкурент Windows на нетбуках, для обычного человека, делающего какие-то документы, некоторые расчеты, электронную почту и Google?Я считаю, что ОС Crome слишком чужда для большинства людей, и у большинства людей есть телефоны Android, которые чувствуют себя как дома.Как поставщик ПО, я бы хотел, чтобы Android-нетбуки продавались гораздо чаще, и я бы приложил больше усилий для разработки ПО.То же самое с Android TV без меню закрывает рынок только для старого подхода Smart-TV.Что-то, чего я не могу понять, имея упакованную Win10 на задней панели моего телевизора с годами, используя там много программ.Отсутствие графического драйвера Android для Raspberry-pie также трудно понять, так как тот, у которого обычный Android, будет громко подключен к телевизору.В Швеции, где я живу, люди моложе 40 лет не смотрят эфир, они транслируют трансляции, играют на общественных началах, пакеты операторов YouTube и кабельного телевидения через Интернет.Наличие обычного Android в телевизоре приведет к использованию множества других приложений.Я вижу, что рыночная возможность для поставщиков ПО закрыта.Это когда MS совершает самоубийство с арендованным ПО (обычные люди не платят), смешивая культуру крупных счетов с простым человеком, открывается огромное маркетинговое окно.И производительность приложения для Android действительно хорошая и не о чем беспокоиться.Рынок приложений ограничивает не производительность, а маркетинговые политики.

Быстро становитесь мастером Java и Android

Вы будете удивлены, насколько проста Java для программиста C,делать это правильно (например, следуя этому руководству).

Это может быть немного сложнее для программиста на C ++, потому что классы в java и C ++ выглядят по-разному, может быть проще изучать классы Java с нуля?Но если вы видите C ++ - код в среде Win32 и OSX, они выглядят обычно с разных планет, поэтому они могут использовать его.

Основным недостатком является то, что вы не получили бы диплом за свое резюме в качестве курса для программистов?

...