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;
}`

pls、.上記のコードに間違いを見つけましたか..よろしくお願いします。

4

0 に答える 0