jni开发-GetMethodID与CallObjectMethod的坑

在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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个用于将Java字符串(jstring)转换为C字符串(char*)的函数。它使用了JNI(Java Native Interface)来进行Java和C之间的交互。下面是对代码的解释: 1. `char* JString2CStr(JNIEnv* env, jstring jstr)`:这是函数的定义,其中 `JNIEnv* env` 是指向JNI环境的指针,`jstring jstr` 是要转换的Java字符串。 2. `char* rtn = NULL;`:声明一个指针 `rtn`,用于存储转换后的C字符串,默认为NULL。 3. `jclass clsstring = (*env)->FindClass(env, "java/lang/String");`:通过调用JNI函数 `FindClass` 来获取 `java/lang/String` 类的引用。 4. `jstring strencode = (*env)->NewStringUTF(env,"GB2312");`:创建一个代表字符编码的Java字符串,并将其转换为JNI的 `jstring` 类型。 5. `jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");`:获取 `getBytes` 方法的方法ID。该方法用于将Java字符串转换为字节数组。 6. `jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode);`:通过调用 `CallObjectMethod` 函数,将 `getBytes` 方法应用于原始的Java字符串 `jstr`,并传入字符编码参数 `strencode`。这将返回一个字节数组。 7. `jsize alen = (*env)->GetArrayLength(env, barr);`:获取字节数组的长度。 8. `jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);`:获取字节数组的指针。 9. `if(alen > 0) { ... }`:如果字节数组的长度大于0,执行以下代码块。 10. `rtn = (char*)malloc(alen+1);`:根据字节数组的长度分配内存空间,加1是为了留出结尾的空字符('\0')的位置。 11. `memcpy(rtn, ba, alen);`:将字节数组中的数据复制到分配的内存空间中。 12. `rtn[alen]=0;`:在分配的内存空间末尾添加一个空字符,以确保C字符串的正确终止。 13. `(*env)->ReleaseByteArrayElements(env, barr, ba,0);`:释放字节数组的内存空间。 14. `return rtn;`:返回转换后的C字符串。 该函数的作用是将Java字符串转换为C字符串,并返回转换后的C字符串。需要注意的是,转换后的C字符串在使用完毕后,需要手动释放内存空间,以避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值