【问题标题】:JNI DETECTED ERROR IN APPLICATION: the return type of CallObjectMethodV does not match void android.media.AudioTrack.play()应用程序中的 JNI 检测到错误:CallObjectMethodV 的返回类型与 void android.media.AudioTrack.play() 不匹配
【发布时间】:2017-11-20 13:33:09
【问题描述】:

我正在尝试使用 AudioTrack 播放来自 JNI 的音频缓冲区

使用以下代码从 JNI 初始化 AudioTrack 对象

    jclass AudioTrack = mEnv->FindClass("android/media/AudioTrack");
    jclass AudioFormat = mEnv->FindClass("android/media/AudioFormat");
    jclass AudioManager = mEnv->FindClass("android/media/AudioManager");

    jfieldID AudioFormat_ENCODING_PCM_16BIT = mEnv->GetStaticFieldID(AudioFormat, "ENCODING_PCM_16BIT", "I");
    jint ENCODING_PCM_16BIT =mEnv->GetStaticIntField( AudioFormat, AudioFormat_ENCODING_PCM_16BIT);

    jfieldID AudioFormat_CHANNEL_CONFIGURATION_MONO = mEnv->GetStaticFieldID(AudioFormat, "CHANNEL_CONFIGURATION_MONO", "I");
    jint CHANNEL_CONFIGURATION_MONO =mEnv->GetStaticIntField( AudioFormat, AudioFormat_CHANNEL_CONFIGURATION_MONO);

    getMinBufferSize = mEnv->GetStaticMethodID(AudioTrack,"getMinBufferSize","(III)I");

    // int minBufferSize = AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_CONFIGURATION_MONO,AdioFormat.ENCODING_PCM_16BIT);
    minBufferSize = mEnv->CallStaticIntMethod(AudioTrack,getMinBufferSize,8000,ENCODING_PCM_16BIT,CHANNEL_CONFIGURATION_MONO);

    //AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT, minBufferSize,AudioTrack.MODE_STREAM);
    jfieldID AudioManager_STREAM_MUSIC = mEnv->GetStaticFieldID(AudioManager, "STREAM_MUSIC", "I");
    jint STREAM_MUSIC = mEnv->GetStaticIntField( AudioManager, AudioManager_STREAM_MUSIC);

    jfieldID AudioTrack_MODE_STREAM = mEnv->GetStaticFieldID(AudioTrack, "MODE_STREAM", "I");
    jint MODE_STREAM = mEnv->GetStaticIntField( AudioTrack, AudioTrack_MODE_STREAM);

    audioTrackConstructor = mEnv->GetMethodID(AudioTrack,"<init>","(IIIIII)V");
    mAudioTrack = mEnv->NewObject(AudioTrack,audioTrackConstructor,STREAM_MUSIC,8000,CHANNEL_CONFIGURATION_MONO,ENCODING_PCM_16BIT,minBufferSize,MODE_STREAM);


    AudioTrack_Play =  mEnv->GetMethodID(AudioTrack,"play","()V");
    AudioTrack_Stop =  mEnv->GetMethodID(AudioTrack,"stop","()V");
    AudioTrack_Write=  mEnv->GetMethodID(AudioTrack,"write","([BII)I");

应用程序出错

JNI DETECTED ERROR IN APPLICATION:返回类型 CallObjectMethodV 不匹配 void android.media.AudioTrack.play()

当我执行代码时

 mEnv->CallObjectMethod(mAudioTrack,AudioTrack_Play);

感谢您的帮助

【问题讨论】:

  • 你使用的是CallObjectMethod,而你应该使用CallVoidMethod
  • 你为什么要这样做?为什么不直接从java层调用AudioTrack.play()呢?
  • @Michael 谢谢它的工作:),谢谢你的帮助(Y)
  • 只需使用pipe()函数并将pipefd[0]传递给java层进行读取
  • 它只工作文件,这是一个output,当被调用两次时 - 离开活动时也没有崩溃

标签: java android android-ndk java-native-interface jnienv


【解决方案1】:

替换这个:

env->CallObjectMethod( mediaPlayer.GetRawObject(), setSurfaceMethodId, parms);

有了这个:

env->CallVoidMethod( mediaPlayer.GetRawObject(), setSurfaceMethodId, parms );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多