Если Андроид


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

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

4 10

4 ответа:

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

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

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

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

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

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

Если вы не делаете что-то, что требует NDK (читай: real time performance sensitive), то придерживайтесь Java.

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

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

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

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