3

我正在使用 JNI 中的 sppex 开发编码机制。我从java调用Encode方法,

遵循运行正常的c代码。

   short in_short[FRAME_SIZE];
   short out_short[FRAME_SIZE];
   short out[FRAME_SIZE];
   char cbits[200];
   int nbBits;
   int i;
   void *st;
   SpeexBits bits;
   /*read file as short array and encode that fram and store in file */
   while (!feof(fin))
   {
     fread(in_short, sizeof(short), frame_size, fin);
       if (feof(fin))
         break; 
      speex_bits_reset(&bits);
      speex_encode_int(st, in_short, &bits);
      nbBits = speex_bits_write(&bits, cbits, 200);
fwrite(&cbits,sizeof(char),nbBits,fout);
}

这个 C 代码编码很好。

当我使用 JNI 实现它时,在 java 中将文件读取为短数组并调用 JNI 编码,编码的数据不正确。

这是JNI代码

jbyteArray Java_com_argusoft_JNIActivity_encode(JNIEnv *env, jobject obj, jshortArray lin){

jbyteArray  returnVal;
    jshort buffer[enc_frame_size]; // enc_frame_size =160
    jbyte output_buffer[enc_frame_size];
    int i, tot_bytes = 0;
    speex_bits_reset(&ebits);
    (*env)->GetShortArrayRegion(env,lin,  0,enc_frame_size, buffer);
    speex_encode_int(enc_state1, buffer, &ebits);
    tot_bytes = speex_bits_write(&ebits,output_buffer,enc_frame_size);
    returnVal =  ((*env)->NewByteArray(env, tot_bytes));
    (*env)->SetByteArrayRegion(env,returnVal, 0, tot_bytes,output_buffer);
    return returnVal;
}`

请,.你能在上面的代码中发现任何错误吗,..提前谢谢。

4

0 回答 0