我能否使用C++语言在Android上开发原生应用?

24

我对以下功能很感兴趣:

  1. 编写一个完全用C++编写的Android Market应用程序(实际上是现有产品的端口)。
  2. 使用快速屏幕缓冲区像素推送(或者使用OpenGL ES来实现)。
  3. 获取用户输入并将其传递到C++代码中。

编写这样的应用程序是否合法?市场政策是否对此类事情有所限制?

6个回答

15

从Android 2.3(姜饼)开始,使用NDK r5是可以实现的,尽管我认为只有支持本地应用程序的设备上才必须安装Gingerbread。

来自native-activity示例:

Android SDK提供了一个帮助类NativeActivity,允许您编写完全本地化的活动。通过本地活动,可以编写完全本地化的应用程序。NativeActivity处理Android框架与本地代码之间的通信,因此您不必对其进行子类化或调用其方法。您需要做的就是在AndroidManifest.xml文件中声明您的应用程序为本地应用程序,并开始创建您的本地应用程序。


1
给我们一个例子。眼见为实 :) - Dr Deo
3
请查看NDK中的samples/native-activity/文件夹。 - tonylo

8
这并不是我的强项,但如果您想用C语言编写程序,有一种叫做Android NDK(Native Development Kit)的东西可供使用。不过我不确定C++编译器的支持情况。
据我所知,您的应用程序可以几乎100%地使用本地代码,但请记住,通过这种方式,您可能会在支持Android硬件中的不同CPU方面遇到困难。如果您需要引导本地代码以便它从Java启动,则对您来说可能不是一个很大的问题。
当我在谷歌上搜索“Android NDK”时,我找到了一些不同的教程。这里有一个非常简约的Hello World:链接。显然,您想要的远不止一个返回字符串给Java的库,但这是一个很好的开始,您可能需要完成所有描述的事情。使用NDK和Android作为关键字进行搜索,您将获得良好的选择。我认为没有必要在此列出它们,因为这样的列表往往会在一年左右内过时且失效。
我猜Google的官方Android Developer网站会保持不变,并更新平台的新版本,其中包含当前的NDK链接。

如果我猜的话,可能是因为你建议使用 Gooling 来代替提供项目的直接链接。有时候人们会很挑剔。不过你提供的链接值得点赞,它提供了非常详尽的环境设置教程,而不仅仅是一小段代码。 - Conspicuous Compiler
除了我所知道的链接不是针对NDK的。它是用于编写控制台应用程序,使用Android开源项目中的交叉编译器。页面上甚至没有出现“NDK”一词,并且该帖子是在发布NDK之前编写的。 - CommonsWare
@CommonsWare:好的,我的错误是称它为“带NDK的Hello World”,这更多地意味着它是用C编写的示例。 - Fredrik
嘿,现在你已经改变了链接,我的第一条评论看起来毫无意义。进步了! - Conspicuous Compiler
我实际上了解NDK,并且正在询问是否可以创建一个全屏OpenGL应用程序,该应用程序使用Java包装器接收输入(可能还包括计时器)事件并将缓冲区输出到屏幕。本地库应具有持久状态,因此Java包装器仅运行主循环并在NDK库内调用“cycle”方法。第二个问题是:是否可以直接将像素数组放在屏幕上而不使用OpenGL? - Hedin
显示剩余3条评论

2
使用Gingerbread(Android 2.3),似乎可以完全使用C++构建您的整个应用程序。
参考: http://phandroid.com/2011/01/11/android-developers-blog-awesome-ndk-leads-to-awesome-apps/ 最新版本的NDK,r5,已经进行了许多大型改进以配合Gingerbread的发布。其中最重要的是能够完全使用C ++为Android 2.3编写本地应用程序。这意味着即使没有Java知识的程序员和开发人员也不必实现任何一行该代码...”
无法保证博主的真实性,但从我所读的内容来看,似乎确实可以这样做。

1

没有100%的本地解决方案,但我认为你正在寻找的是Android NDK(Native Development Kit)

从他们的网站上可以看到:“请注意,NDK不能让您开发仅限本机的应用程序。 Android的主要运行时仍然是Dalvik虚拟机。”

我相信它可以让你从Android应用程序中调用自己的本地代码

我个人从未在我的游戏中使用过它,但我确信它会在很多方面有所帮助(例如能够管理自己的内存而不会因垃圾收集器而出现“卡顿”)


1

0

http://developer.android.com/guide/basics/what-is-android.html

“Android SDK提供了使用Java编程语言在Android平台上开始开发应用程序所需的工具和API。”

http://arstechnica.com/open-source/news/2009/06/android-goes-beyond-java-gains-native-cc-dev-kit.ars

一般来说,你不需要这样做。虽然JNI提供了一些有限的C++支持,但它主要是为了补充Java代码而不是替代它。没有针对C++的框架/API支持(据我所知),因此这并不是一个真正的选择。

我相信OpenGL API至少在NDK级别上是直接暴露的,因此对于全屏游戏来说,完全使用本地代码肯定是一个选择(也可能是推荐的选择)。 - Pavel Minaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接