Android NativeActivity

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

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

Solutions Collecting From Web of "Android NativeActivity"

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

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

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

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

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

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

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

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

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

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

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