在Android中从本地c返回jbyteArray

我使用本机c从audio文件读取数据到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; } 

它是如何完成的?

Solutions Collecting From Web of "在Android中从本地c返回jbyteArray"

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

有关SetByteArrayRegionGetByteArrayElementsReleaseByteArrayElements更多详细信息, 请参阅此处 。

注:这个问题可能是这个问题的特例