2012-04-30 11 views
7

Utilizo c nativo para leer datos de un archivo de audio en el puntero jbyte. Ahora quiero enviarlo a Java como jbyteArray.Devolución de jbyteArray desde c nativo en Android

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; 

} 

¿Cómo se hace?

Respuesta

23

uso SetByteArrayRegion

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

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

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



también se podría utilizar GetByteArrayElements por ejemplo:

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 para más detalles sobre SetByteArrayRegion, GetByteArrayElements y ReleaseByteArrayElements.


NB: esta pregunta es probablemente un caso especial de this question

+0

Por favor, editar establecimiento de memoria. Primero arg es el destino –

+0

@Roman ~ pero la intención aquí * es * usar 'memcpy' para copiar' data' en 'rawjBytes' ?! & muestra una alternativa a 'SetByteArrayRegion' donde digamos que los' grandes' datos deben construirse de forma dinámica/incremental: podemos usar 'GetByteArrayElements' para obtener acceso al contenido' jbyteArray'; luego, llamar a 'ReleaseByteArrayElements' con tercer valor cero de 3er arg asegura que los datos se vuelvan a copiar (si la memoria subyacente está anclado o no). – violet313

+0

Ow ... Lo siento, no lo entiendo. Muchas gracias de todos modos, me ha ayudado mucho. –

Cuestiones relacionadas