15

ネイティブ c を使用して、オーディオ ファイルから jbyte ポインターにデータを読み取ります。今、私はそれをjbyteArrayとしてJavaに送りたいです。

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;

}

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

4

1 に答える 1

31

使用するSetByteArrayRegion

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

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

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



GetByteArrayElements たとえば、次のように使用することもできます。

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);

SetByteArrayRegionGetByteArrayElementsおよびの詳細については、こちらを参照ReleaseByteArrayElementsしてください。


注意:この質問はおそらくこの質問の特殊なケースです

于 2012-04-30T13:34:35.720 に答える