【问题标题】:Costs of using the JNI on android在 android 上使用 JNI 的成本
【发布时间】:2011-05-12 11:26:36
【问题描述】:

我正在编写一个使用 java 代码和本机代码的应用程序(在 android 上)。每隔一段时间,就需要播放声音。不幸的是,本机代码没有用于音频的 API(或至少是稳定/官方的),但只有它知道何时需要播放声音。我想出了两种方法:

  1. 具有跟踪(在队列中或诸如此类的)需要播放的声音的功能。调用时,它将返回一个字符串,给出需要播放的声音的名称。这样,java 代码可以调用这个函数,直到它得到一个空字符串,并在其中播放声音。

  2. 返回需要播放的声音字符串数组,如果没有则返回空数组。

但后来我意识到 JNI 调用很昂贵。这些仍然需要Java代码在每次迭代左右调用该函数,以确保它正在播放正确的东西。对#1 来说尤其糟糕,因为它必须要求播放所有剩余的声音,尽管我想象的不会更糟。

那么,JNI 调用是否过于昂贵而无法实现?本机代码是否应该以某种方式通知 Java 代码需要在没有 Java 代码首先询问的情况下播放声音(从而减少 JNI 调用)。我确实注意到,android opengl es 2 ndk 示例中的绘制代码经过了很多 JNI,看起来还不错,但话又说回来,它只绘制了一个三角形和一个背景。

我不知道我会如何分析这个,除了同时制作两者并看看什么效果更好,所以我非常感谢您的意见。非常感谢。

【问题讨论】:

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


    【解决方案1】:

    请查看来自Tegra Resources 的 NDK 示例。

    Android SDK 和 NDK 示例应用程序和文档(NV_EVENT、加速度计、音频、JNI 性能、OpenGL ES 2.0 和多点触控)

    它包含您想要实现的 JNI 音频示例。还包括 OpenGL ES 2.0 示例和 JNI 性能测试代码。

    (此外,用于 NDK 的 OpenSL ES 音频 API 从 Android 2.3 开始可用。)

    【讨论】:

    • 没有足够的手机运行 2.3 以使使用 openssl es ndk 端值得。尽管如果是内存服务器,您也可以在 2.2 上将 openssl 与 ndk 一起使用,即使他们直到 2.3 才将其添加到 ndk。至于 tegra 资源链接,有多少手机拥有所需的硬件?谢谢
    • NDK 示例不仅适用于 Tegra 设备。它可以在除面向 Tegra 的 OpenGL ES 1.1/2.0 扩展之外的所有 Android 手机上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多