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