关于Android上的JNI的问题

时间:2015-02-19 14:30:20

标签: java android c++ linux java-native-interface

我打算创建一个兼容Windows CE和Android设备的软件。

还没有任何决定,但到目前为止,我已经想到我可以使用C ++代码编写程序的大部分内容,这些代码可以在这两个平台上重用,除了依赖于系统的东西,比如线程。在我的情况下,强烈建议使用C ++来提高性能。

在依赖系统的情况下,我会创建以两种不同方式实现的接口,一种使用win32 API,另一种使用linux等效。代码的其他部分(逻辑)将是独立的并在两个平台上重用。

不能用C ++编写的应用程序的唯一部分是用户界面。在Android平台上使用Android API,在Windows CE上使用其他东西(C#,Java,还不知道)。

我读过Android与其他Linux发行版不同,因为很多linux功能都不能从本机代码中获得。

所以我的问题是:是否可以使用JNI本地创建和使用来自本机linux api的套接字,线程,关键部分(以及任何其他依赖于系统的东西)(即相当于win32 api但是对于Linux)还是我总是要将它们创建到Java层并将它们传递给本机代码?

我还没有决定我将如何建立这个,我只是告诉自己不同的可能性。

谢谢。

2 个答案:

答案 0 :(得分:1)

NDK实现了POSIX(包括pthread,mutex)和BSD套接字,因此您无需使用java对象创建它们。

然而,STL支持仍然是糟糕的IMO,您可能需要注意自己的代码或移植任何依赖库。

答案 1 :(得分:0)

可以用JNI做所有这些,但在这样做之前我会三思而行。使用JNI有其负债份额;它将使开发和调试相当更加困难。您最终还会对Java代码进行大量回调以与GUI进行通信。考虑正在进行的操作的视觉进度指示器等功能。并且不要忘记,最终,由于每个JNI调用所需的额外间接,您的应用程序的性能可能遭受。在任何一种情况下都要确保测量性能。 JNI或C ++就此而言并不能自动提高速度。

此外,它可能比你想象的更难以镜像"你的应用程序在另一个操作系统Android作为一种操作系统,不仅在GUI方面表现不同(例如,在Android应用程序中提供后退按钮是无意义的),而且在内部也是如此,其典型的应用程序架构分解为服务,活动和接收者。它不仅仅是"一个不同的GUI",根本不是。

如果你的后端功能确实可以并且应该在两个平台上表现相同,那么继续,用C ++编写并通过JNI在Android上重复使用它。但它可能更容易,可能可以同等或更高性能,只需在Android上使用Java从头开始实现它或部分内容。如果不知道有关您项目的任何细节,就无法说出来。

为什么不尝试使用JNI在Android上实施简单的测试应用?尝试使用NDK在后台线程中发送HTTP请求,并将respone作为String写回Java。你最终会发现它有效,但你也会更好地理解所涉及的困难。