Android NDK 的限制?

17

我有一个关于在Android平台上本地代码(native code)的限制的问题。

基本上,我已经开发了一个使用UDP套接字进行SIP/RTP通信和使用OpenAL进行音频录制/播放的本地C代码库 - 基本上整个应用程序都是用它来实现的。 我希望尽可能多地使用本地C代码而不是Java代码。我想这样做是因为我还将在其他平台上使用它。

那么我的问题就很简单 - 是否可能只使用Java来实现GUI,然后所有处理都在本地代码中完成? 当我的本地代码尝试创建套接字、绑定、录制音频、播放时,会发生什么情况 - 因为它是本地代码,我是否需要为其设置权限(例如应用程序访问麦克风等)或者它会直接跳过这些内容,因为它是本地代码? 在Android上,本地代码能否像在PC上一样几乎可以做任何事情?

抱歉如果问题不太清楚;请告诉我,我会尽力改进它

谢谢

4个回答

4

在本地代码中,您可以做任何想做的事情,但是唯一真正支持的操作系统级别的东西是OpenGL、OpenSL和一些数字处理库(压缩、数学等)。

然而,您随时可以使用JNI调用Java方法,因此可以使用标准Android API进行网络操作(例如Socket类等)。显然,由于调用经过Java API,所有普通的Android权限都适用(如android.permission.INTERNET)。

编辑:正如评论中所阐述的那样,NDK中的标准库确实支持套接字。


你能详细说明一下你所说的“支持”是什么意思吗?例如,我在NDK库列表中找不到sockets。我还能使用它们吗?你使用哪些头文件和其他东西 - 没有sys/sockets吗? - KaiserJohaan
1
你不会喜欢听这个,但是... 你必须通过Java进行,也就是使用FindClass来获取Socket类,然后获取构造函数的方法、read方法的方法和write方法的方法,将socket作为jobject存储在代码中,并使用CallVoidEnvMethod或类似的方法。听起来绝对很糟糕,但是你可以编写一个薄层,在C和Java之间进行转换,最终只需要少量这些转换函数。 - EboMike
顺便说一下,正如 Kazuki 指出的那样,套接字 API 可能会得到完全支持,但个人始终通过 Java 进行间接操作。 - EboMike
请查看我的答案中的OpenSSLSocketImpl.cpp文件——这展示了如何使用OpenSSL的本地API与Java创建的套接字。 - jglouie
5
@EboMike,你关于套接字需要使用 JNI 的说法是错误的。和大多数其他标准 Unix 操作一样,它们可以由本地代码完成。只有在 UI 和其他 Android 服务方面才需要使用 JNI。 - Chris Stratton
1
我在为Android编写的守护程序中使用了curl c库(纯本地代码),没有出现问题。当我将该代码合并到一个Java Android应用程序中,使用JNI调用时,它仍然可以正常运行,但是您需要在AndroidManifest.xml中添加INTERNET权限,否则调用将失败,无论应用程序是否位于/data/app或/system/app。 - Colin

3

您的应用程序仍需要权限。例如,如果在清单文件中没有android.permission.INTERNET,则无法使用本地套接字。

<manifest xlmns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

另一种选择是在Java层创建套接字并将其传递下去。以下是在本地环境中与套接字交互的示例,请参见方法org_..._OpenSSLSocketImpl_connect()http://www.netmite.com/android/mydroid/dalvik/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp

3

原生Android API是一篇很好的NDK文章。

是否可以只使用Java来处理GUI,然后所有处理都在本地代码中?

是的。您需要将适当的权限设置到AndroidManifest中。

录制音频,播放它,

您需要在本地端使用OpenSL ES API来录制和播放音频。这意味着您的应用程序应该是Android 2.3或更高版本。

或者,NVIDIA提供了一个框架,即使是针对Android 2.2或更早版本,我们也可以使用C++来开发Android事件、传感器、音频等功能。

Tegra资源-Android SDK和NDK示例应用程序和文档


OpenAL 不被 Android 支持吗?我记得在某个地方看到过,或者你只需将 OpenAL 共享库包含在 APK 中即可? - KaiserJohaan
OpenAL软件实现适用于Android。这是一个软件实现,因此,OpenSL ES比这个OpenAL实现更有效率。 - Kazuki Sakamoto

0

你可能会喜欢查看csipsimple,它是在Java Android应用程序中使用pjsip SIP库(用C语言编写)的示例。

我没有深入研究它如何进行套接字通信,但它应该为你提供一个更完整的示例,以便你尝试实现自己的功能。


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