JNI: ошибка кодирования данных speex - PullRequest
3 голосов
/ 29 февраля 2012

Я занимаюсь разработкой механизма кодирования с использованием sppex в JNI.Я вызываю метод Encode из Java,

После кода 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. Не можете ли вы найти ошибку в приведенном выше коде,.. Заранее спасибо.

...