【问题标题】:Android NDK limitations?Android NDK 限制?
【发布时间】:2011-10-03 06:02:59
【问题描述】:

我有一个关于在 Android 平台上使用本机代码所能做的限制的问题。

基本上,我已经用原生 C 代码开发了一个库,它使用 UDP 套接字进行 SIP/RTP,并使用 OpenAL 进行音频录制/播放 - 基本上是整个应用程序。 这个想法是尽可能多地使用本机 C 代码而不是 Java 代码。我想这样做是因为我也将在其他平台上使用它。

然后我的问题很简单 - 是否可以仅将 Java 用于 GUI,然后在本机代码中进行所有处理? 当我的本机代码尝试创建套接字、绑定它、录制音频、播放它等时会发生什么 - 因为它在本机代码中,我是否需要为其设置权限(例如应用程序访问麦克风等)或将它只是绕过这些东西,因为它的本机代码? 原生代码可以在 Android 上像在 PC 上那样做任何它想做的事情吗?

如果不清楚,请见谅;告诉我,我会努力改进的

谢谢

【问题讨论】:

    标签: android c permissions android-ndk native


    【解决方案1】:

    您仍然需要您的应用程序拥有权限。例如,如果清单中没有 android.permission.INTERNET,您的本机套接字将无法工作。

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

    另一种选择是在 Java 层创建套接字并将其传递下去。下面是一个在原生地与socket交互的例子,见方法org_..._OpenSSLSocketImpl_connect()

    http://www.netmite.com/android/mydroid/dalvik/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp

    【讨论】:

      【解决方案2】:

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

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

      编辑:正如 cmets 中所述,作为 NDK 一部分的标准库确实支持套接字。

      【讨论】:

      • 您能否详细说明“支持”的含义?例如,我在 NDK 库列表中找不到套接字。我还能使用它们吗?你使用什么头文件和东西 - 没有 sys/sockets 吗?
      • 你不会喜欢这个,但是……你必须通过Java,即你在Socket上使用FindClass,然后得到构造函数的方法,read的方法,write 的方法,在代码中将套接字存储为jobject,然后使用CallVoidEnvMethod 或类似的东西。这听起来很糟糕,但是您可以编写一个比在 C 和 Java 之间进行转换的薄层,并最终只使用少数这些转换函数。
      • 顺便说一句,正如 Kazuki 所指出的,可能完全支持套接字 API,但我个人一直通过 Java 使用这种间接。
      • @EboMike 你对需要 jni 的套接字的声明是错误的。与大多数其他标准unixisms 一起,它们可以从本机代码完成。主要是 UI 和其他需要 jni 的 android 服务。
      • 我在我为 Android 编写的守护程序(纯本机代码)中使用 curl c 库,没有问题。当我将代码合并到 java android 应用程序中时,使用 JNI 调用,它继续运行良好,但是您需要 AndroidManifest.xml 中的 INTERNET 权限,否则调用将失败,无论应用程序是在 /data/app 还是 /系统/应用程序。
      【解决方案3】:

      The Native Android API 是 NDK 的一篇不错的文章。

      是否可以仅将 Java 用于 GUI,然后在本机代码中进行所有处理?

      是的。并且您需要为您的 AndroidManifest 设置适当的权限。

      录制音频,播放,

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

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

      Tegra Resources - Android SDK & NDK sample applications and documentation

      【讨论】:

      • Android 不支持 OpenAL 吗?我想我在某处读过它,或者您可以在 apk 中包含 OpenAL 共享库?
      • OpenAL software implementation for Android。这是一个软件实现,因此,OpenSL ES 比这个 OpenAL 实现更有效。
      【解决方案4】:

      您可能想查看csipsimple,这是在java android 应用程序中使用pjsip sip 库(用C 编写)的示例。

      我还没有研究它是如何进行套接字通信的,但它应该会给你一个更完整的例子来说明你正在尝试做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多