Android NDK刚刚被大大扩展,包括完全用本机C / C ++代码编写android应用程序的支持。现在可以使用本机代码捕获键盘和触摸屏上的输入事件,还可以使用新的NativeActivity类在C / C ++中实现应用程序生命周期。
鉴于所有扩展的本机功能,是否值得完全绕过Java并在本机代码中编写Android应用程序?
答案 0 :(得分:8)
NDK本身不是本地的。它在很大程度上是围绕Android SDK的JNI包装器。使用NativeActivity为您提供了一种处理某些应用程序生命周期事件的便捷方式,并在顶部添加您自己的本机代码。 ALooper,AInputQueue等都是Java SDK对应物的JNI包装器,其中一些包含私有且无法访问真实应用程序的其他代码。
在Android开发方面,没有完全用本机C ++编写应用程序的东西 - 你会(在我能想到的每个真实应用案例中)总是需要使用Android API:s,这是很大程度上纯Java。您通过NDK提供的包装器或您自己创建的包装器使用这些包装器并不会真正改变它。
所以,回答你的问题:不,这是不值得的,因为你最终会为SDK调用编写JNI包装器,而不是将JNI包装器写入你自己的Java方法,这些方法做同样的事情,代码更少,更简单的代码和更快的代码。例如,显示使用“pure c ++”的对话框涉及很多JNI调用。只是通过JNI调用Java方法做同样的事情将为您提供更快的代码(一个JNI调用),并且可以说,代码更容易维护。
要完全了解您可以做什么,您必须检查Android源代码。从NDK中提供的native_app_glue.c开始,然后继续执行AActivity,ALooper,AInputQueue等操作系统.Google Code Search对此非常有帮助。 : - )
如果在Java中很容易做,并且包含许多调用,则通过JNI调用一个方法来完成所有操作,而不是编写所有额外的代码来执行多个JNI调用。保留尽可能多的现有C ++代码合理。
答案 1 :(得分:4)
如果您只是制作标准应用程序,那就不一样了。 Java SDK比现在的版本更完整,所以你仍然会让自己变得更加困难。
如果你没有做一些需要NDK的东西(阅读:实时性能敏感),那么坚持使用Java。
答案 2 :(得分:3)
如果可以的话,请坚持使用java风格的应用程序,直到支持本机活动的Android版本构成安装基础的重要部分。
对于以前很难做的事情 - 特别是现有代码的端口 - 这可能会有很大的帮助。
现在还不完全清楚,只是编写自己的瘦java包装器已经发生了什么变化。例如,是否还有dalvik VM的副本?
答案 3 :(得分:2)
只是一些值得思考的东西但是如果你在iOS和Android上有一个应用程序,一些C / C ++代码可能是可共享的。显然,iOS Obj-C和平台特定代码在其他地方不起作用。 (同样适用于Android特定的东西)。但是你可能有一些平台中立的共享代码。