Как это сделать: Руководство 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, они выглядят обычно с разных планет, поэтому они могут использовать его.
Основным недостатком является то, что вы не получили бы диплом за свое резюме в качестве курса для программистов?