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、.上記のコードに間違いを見つけましたか..よろしくお願いします。