2012-04-30 19 views
7

Używam natywnego c do odczytu danych z pliku audio do wskaźnika jByte. Teraz chcę wysłać go do java jako jbyteArray.Powracanie jbyteArray z natywnego c w Androidzie

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; 

} 

Jak to jest zrobione?

Odpowiedz

23

użycie SetByteArrayRegion

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

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

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



można było również skorzystać GetByteArrayElements np

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 więcej szczegółów na temat SetByteArrayRegion, GetByteArrayElements i ReleaseByteArrayElements.


UWAGA: to pytanie jest prawdopodobnie szczególnym przypadkiem this question

+0

Proszę edycji memcpy. Pierwszy argument jest docelowy –

+0

@Roman ~, ale celem tutaj * jest * użycie 'memcpy' do skopiowania' danych' do 'rawjBytes' ?! & demonstruje alternatywę dla 'SetByteArrayRegion', gdzie powiedzmy, że duże' dane' musi być konstruowane dynamicznie/przyrostowo: możemy użyć 'GetByteArrayElements', aby uzyskać dostęp do zawartości' jbyteArray'; następnie wywołanie 'ReleaseByteArrayElements' z 3-wartościowym argonem o wartości zerowej zapewnia skopiowanie danych (niezależnie od tego, czy podpięta jest pamięć podstawowa). – violet313

+0

Ow ... Przepraszam, nie rozumiem. Bardzo dziękuję, bardzo mi to pomogło. –

Powiązane problemy