从 Android 中的原生 c 返回 jbyteArray
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10383458/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Returning jbyteArray from native c in Android
提问by Raneez Ahmed
I use native c to read data from an audio file to jbyte pointer. Now i want to send it to java as an jbyteArray.
我使用本机 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;
}
How it is done?
它是如何完成的?
回答by violet313
use SetByteArrayRegion
用 SetByteArrayRegion
charCnt=fread(data, 1, size, fin);
jbyteArray result=(*env)->NewByteArray(env, size);
(*env)->SetByteArrayRegion(env, result, 0, size, data);
one could also use GetByteArrayElements
eg:
也可以使用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);
see herefor more details on SetByteArrayRegion
, GetByteArrayElements
and ReleaseByteArrayElements
.
有关SetByteArrayRegion
,GetByteArrayElements
和 的更多详细信息,请参见此处ReleaseByteArrayElements
。
NB:this question is probably a special case of this question
注意:这个问题可能是一个特例,这个问题