jni开发-GetMethodID与CallObjectMethod的坑
2019-05-05 11:09
1786 查看
版权声明:本文为工匠先生原创文章,未经博主允许不得转载 https://blog.csdn.net/u013470102/article/details/89841464
在java层中声明一个方法用于创建一个audiotrack,在C层中调用这个方法并获取audiotrack对象。
先看下面的代码:SuPlayer.java
public AudioTrack createAudioTrack(int sampleRateInHz, int nb_channels) { //固定格式的音频码流 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //声道布局 int channelConfig; if (nb_channels == 1) { channelConfig = android.media.AudioFormat.CHANNEL_OUT_MONO; } else if (nb_channels == 2) { channelConfig = android.media.AudioFormat.CHANNEL_OUT_STEREO; } else { channelConfig = android.media.AudioFormat.CHANNEL_OUT_STEREO; } int bufferSizeInBytes = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes, AudioTrack.MODE_STREAM); //播放 //audioTrack.play(); //写入PCM //audioTrack.write(audioData, offsetInBytes, sizeInBytes); return audioTrack; } //只播放视频 public static native int playVideo(String url, Surface surface); //音视频同步播放 public native void playSyncVideo(String url, Surface surface);
C层实现:
JNIEXPORT void JNICALL Java_com_eebbk_suplayer_SuPlayer_playSyncVideo(JNIEnv *env, jobject thiz, jstring inputPath_, jobject surface) { int i = 1; //JNI begin------------------ jclass player_class = env->GetObjectClass(jthiz);//获取当前类的class //获取methodID,调java层的createAudioTrack函数,返回值是(II)Landroid/media/AudioTrack; //详细参考:http://hubeihuyanwei.blog.163.com/blog/static/28205284201282911925396/ jmethodID create_audio_track_mid = env->GetMethodID(player_class, "createAudioTrack", "(II)Landroid/media/AudioTrack;"); if (create_audio_track_mid == NULL) { LOGE("%s", "createAudioTrack 方法没找到!\n"); } //获取audio_track对象,传入methodid、java层中对应方法的形参 jobject audio_track = env->CallObjectMethod(jthiz, create_audio_track_mid, i, i); //调用AudioTrack.play方法 jclass audio_track_class = env->GetObjectClass(audio_track); jmethodID audio_track_play_mid = env->GetMethodID(audio_track_class, "play", "()V"); env->CallVoidMethod(audio_track, audio_track_play_mid); //AudioTrack.write jmethodID audio_track_write_mid = env->GetMethodID(audio_track_class, "write", "([BII)I"); LOGE("%s", "44444"); //JNI end------------------ }
就这么简单的调用顺序,为什么要写这篇笔记呢???因为在写这个的时候,把SuPlayer.java中public AudioTrack createAudioTrack(int sampleRateInHz, int nb_channels)这个方法写成了静态方法public static AudioTrack createAudioTrack(int sampleRateInHz, int nb_channels)。导致排查的时候一直以为env->GetMethodID()这个函数写的有问题。
相关文章推荐
- [Android JNI开发]JAVA编译器的坑——GetStaticMethodID 找不到的另外一种可能
- unix下的jni使用指南(2)--如何使用GetFieldID和GetMethodID
- DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.NoSuchMethodE
- Android jni GetFieldID 和 GetMethodID 函数的说明
- JNI GetMethodID called with pending exception java.lang.NoSuchMethodError
- java jni GetFieldID和GetMethodID说明(转)
- java jni GetFieldID 和 GetMethodID 以及参数的说明
- Android jni GetFieldID 和 GetMethodID 函数的说明
- JNI: Passing multiple parameters in the function signature for GetMethodID
- unix下的jni使用指南(2)--如何使用GetFieldID和GetMethodID
- JNI之GetMethodID方法签名
- JNI学习1——Android jni GetFieldID 和 GetMethodID 函数的说明
- jni GetMethodID 多个参数
- Ambiguous method call. Both getClass () in Object and getClass () in Object match.
- classidget获取object的id, 递归遍历所有方法 DictMethod | callObject | invokeObjectMethod
- Fatal error: Call to a member function getSource() on a non-object in G:\wamp\www\ChinaMagicCube\ap
- 关于Attempt to invoke virtual method 'HSSFCell.getCellType(int)'' on a null object reference
- org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call method test() on null context object
- Fatal error: Call to a member function getData() on a non-object in /data/php/framework/exts/zii/wid
- 安卓 jni 开发错误 UnsatisfiedLinkError: Native method not found