2012-04-30 24 views
7

ネイティブcを使用して、オーディオファイルからjbyteポインタにデータを読み込みます。今私はjbyteArrayとしてjavaに送信したいと思います。AndroidのネイティブcからjbyteArrayを返す

jbyteArray Java_com_app_audio_player_readData(JNIEnv * env, jobject jobj,jstring readPath) 
{ 

FILE *fin; 
const char *inFile= (*env)->GetStringUTFChars(env,readPath,0); 
fin = fopen(inFile, "r"); 

fseek(fin, 0, SEEK_END); // seek to end of file 
int size = ftell(fin); // get current file pointer 
fseek(fin, 0, SEEK_SET); 

jbyte *data=(jbyte *)malloc(size*sizeof(jbyte)); 
int charCnt = 0; 

charCnt=fread(data, 1, size, fin); 


jbyteArray result=(*env)->NewByteArray(env, size); 

    //-- I want to convert data to jbyteArray and return it to java  

fclose(fin); 
return result; 

} 

どのように行われますか?

答えて

23

使用SetByteArrayRegion

charCnt=fread(data, 1, size, fin); 

jbyteArray result=(*env)->NewByteArray(env, size); 

(*env)->SetByteArrayRegion(env, result, 0, size, data); 



1も使用することができGetByteArrayElements 例:SetByteArrayRegionGetByteArrayElementsReleaseByteArrayElementsの詳細については、

jboolean isCopy; 
jbyte* rawjBytes = (*env)->GetByteArrayElements(env, result, &isCopy); 

//do stuff to raw bytes 
memcpy(rawjBytes, data, size*sizeof(jbyte)); 

(*env)->ReleaseByteArrayElements(env, result, rawjBytes, 0); 

see here


NB:この質問はおそらくthis question

+0

してください、編集のmemcpyの特殊なケースです。最初のargはあて先です –

+0

@Roman〜ですが、ここでの意図は* 'memcpy'を使って' data'を 'rawjBytes'にコピーするのですか? & 'SetByteArrayRegion'の代わりに、大規模な' data'を動的に/増分的に構築する必要があるところを示します。 'GetByteArrayElements'を使用して' jbyteArray'コンテンツにアクセスできます。ゼロ値の3番目の引数を持つ 'ReleaseByteArrayElements'を呼び出すと、データが元に戻される(基底のメモリが固定されているかどうかにかかわらず)ことが保証されます。 – violet313

+0

ああ...申し訳ありませんが、私はそれを取得しません。とにかくありがとう、それは私をたくさん助けてくれました。 –

関連する問題