Java 在android上使用JNI的成本

Java 在android上使用JNI的成本,java,c++,android,java-native-interface,android-ndk,Java,C++,Android,Java Native Interface,Android Ndk,我正在编写一个应用程序(在android上),它使用java代码和本机代码。每隔一段时间,就需要播放一个声音。不幸的是,本机代码没有用于音频的API(或至少稳定/官方的API),但只有它知道何时需要播放声音。我想出了两种方法: 有一个功能可以跟踪(在队列中)需要播放的声音。调用时,它将返回一个字符串,给出需要播放的声音的名称。这样,java代码就可以调用这个函数,直到它得到一个空字符串,并在其中播放声音 返回需要播放的声音字符串数组,如果没有,则返回空数组 但后来我意识到JNI电话很贵。这些仍然

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

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

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

  • 但后来我意识到JNI电话很贵。这些仍然需要java代码在每次迭代中调用函数,以确保它运行正确。对#1来说尤其糟糕,因为它需要播放剩下的每一个声音,尽管我想不会太糟糕

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


    我不知道我将如何分析这一点,除了将两者结合起来,并看看什么更好,所以我非常感谢您的意见。非常感谢。

    请查看来自的NDK样品

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

    它包括您想要实现的JNI音频示例。还包括OpenGLES2.0示例和JNI性能测试代码


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

    请从中查看NDK示例

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

    它包括您想要实现的JNI音频示例。还包括OpenGLES2.0示例和JNI性能测试代码


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

    没有足够的手机运行2.3,因此使用OpenSL ES NDK端是值得的。虽然如果是内存服务器,您也可以将opensl es与2.2上的ndk一起使用,即使他们直到2.3才将其添加到ndk中。至于tegra资源链接,有多少手机具备所需的硬件?感谢您NDK样品不仅适用于Tegra设备。除了Tegra的OpenGL ES 1.1/2.0扩展之外,它可以在所有Android手机上运行。没有足够的手机运行2.3,所以使用opensl ES ndk端是值得的。虽然如果是内存服务器,您也可以将opensl es与2.2上的ndk一起使用,即使他们直到2.3才将其添加到ndk中。至于tegra资源链接,有多少手机具备所需的硬件?感谢您NDK样品不仅适用于Tegra设备。除了Tegra的OpenGL ES 1.1/2.0扩展,它可以在所有Android手机上运行。