将缓冲区从SuperpoweredAndroidIO传递到Java InputStream / Android NDK

时间:2017-11-12 11:10:46

标签: java android c++ android-ndk superpowered

我正在使用惊人的Superpowered库(SuperpoweredAndroidAudioIO)进行低延迟的音频录制。虽然基本概念对我来说很清楚,但我希望将录制的音频(到达缓冲区)传递回Java中的InputStream (无需录制到文件中),然后我可以从中读取录制的音频并处理它。

我想这个问题也可以更普遍地被问到 - 如何用C ++定期更新的缓冲区为Java输入一个InputStream?

1 个答案:

答案 0 :(得分:0)

好吧,我在评论中收到的建议原来是一个简单而有效的解决方案: 使用C ++创建管道:

 if (pipe(pipefd) == -1) {
    __android_log_print(ANDROID_LOG_VERBOSE, "C++", "Error creating pipe");
 }
...

将文件描述符传递给Java:

...
    return pipefd[0];
...

然后在Java / Android中:

private ParcelFileDescriptor.AutoCloseInputStream underlyingStream;
ParcelFileDescriptor pfd = ParcelFileDescriptor.adoptFd(getFD());
underlyingStream = new ParcelFileDescriptor.AutoCloseInputStream(pfd);

对我来说工作很好,但我当然仍然乐意接受其他建议。