Android NativeActivity

Android NDK только что был значительно расширен, включая поддержку написания приложений для Android полностью в собственном коде C/С++. Теперь можно записывать входные события на клавиатуре и сенсорном экране с помощью собственного кода, а также реализовывать жизненный цикл приложения в C/С++ с использованием нового класса NativeActivity.

Учитывая все расширенные собственные возможности, было бы целесообразно полностью обойти Java и написать приложение Android в собственном коде?

Ответ 1

NDK не является родным. Это в значительной степени обертка JNI вокруг Android SDK. Использование NativeActivity дает вам удобный способ работы с определенными событиями жизненного цикла приложений и добавляет собственный собственный код сверху. ALooper, AInputQueue и т.д. - все JNI-обертки Java SDK-коллег, некоторые с дополнительным кодом, который является частным и недоступным для реальных приложений.

Когда дело доходит до разработки Android, нет такой вещи, как написание приложения полностью на родном С++ - вы будете (в каждом реальном случае приложения, о котором я могу думать), всегда должны использовать Android API: s, которые должны в огромной степени чистой Java. Wether вы используете их через обертки, предоставленные NDK или обертки, которые вы создаете сами, на самом деле не меняете это.

Итак, чтобы ответить на ваш вопрос: Нет, это было бы нецелесообразно, потому что вы закончите писать обертки JNI для вызовов SDK вместо того, чтобы писать обертки JNI к вашим собственным методам Java, которые делают то же самое, с меньшим количеством кода, более простой код и более быстрый код. Например, отображение диалога с использованием "чистого С++" включает в себя довольно много вызовов JNI. Просто вызов метода Java через JNI, который делает то же самое, даст вам более быстрый код (один вызов JNI) и, возможно, код, который легче поддерживать.

Чтобы полностью понять, что вы можете сделать, вам действительно нужно изучить исходный код Android. Начните с native_app_glue.c, который доступен в NDK, а затем продолжите реализацию ОС для AActivity, ALooper, AInputQueue и т.д. Поиск кода Google - отличная помощь в этом.: -)

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

Ответ 2

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

Если вы не делаете то, что требует NDK (читайте: чувствительность в реальном времени), тогда придерживайтесь Java.

Ответ 3

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

Для вещей, которые было трудно сделать раньше - особенно портов существующего кода - это, вероятно, будет большой помощью.

Не совсем ясно, что изменилось, просто написав собственную тонкую оболочку java. Например, есть ли еще где-то копия dalvik VM?

Ответ 4

Просто пища для размышлений, но если у вас есть приложение на iOS и Android, некоторые C/С++-коды могут быть доступны для совместного использования. Очевидно, что код iOS Obj-C и специфичный для платформы код не будет работать в другом месте. (То же самое для Android). Но у вас может быть некоторый общий код, нейтральный для платформы.