0

我编写了一个基本应用程序,它开始使用双簧管库进行录音。在 MainActivity 中有 2 个按钮调用 2 个 JNI 函数,它们是:

  • 录制音频()
  • 停止录制()

在 native-lib.cpp 中,这两个 JNI 函数定义如下:

extern "C" JNIEXPORT jboolean JNICALL
Java_com_example_oboeaudiorecorder_MainActivity_recordAudio(
        JNIEnv * env,
        jobject MainActivity
) {
    static auto a = OboeAudioRecorder::get();
    a->StartAudioRecorder();
    return true;
}

extern "C" JNIEXPORT jboolean JNICALL
Java_com_example_oboeaudiorecorder_MainActivity_stopRecording(
        JNIEnv * env,
        jobject MainActivity
        ) {
    static auto a = OboeAudioRecorder::get();
    a->StopAudioRecorder();
    return true;
}

OboeAudioRecorder 类是一个单例。

当我点击开始录制的按钮时,录制已经开始了。但是当我想单击停止录制的按钮时,无法单击该按钮。我认为双簧管录音的开始阻塞了主 UI 线程。

OboeAudioRecorder 单例类可以在以下位置查看: https ://github.com/reuniware/OboeAudioRecorder/blob/master/app/src/main/cpp/OboeAudioRecorder.cpp

如何避免这种情况?谢谢。

4

1 回答 1

0

我现在从一个线程调用 recordAudio 函数,如下所示:

buttonRecordAudio.setOnClickListener{
    val permission = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)

    if (permission != PackageManager.PERMISSION_GRANTED) {
        Log.i("", "Permission to record denied")
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), RECORD_REQUEST_CODE)
    } else {
        Thread(Runnable { recordAudio() }).start()
    }
}
于 2020-07-03T20:35:34.903 回答