从 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:29:41  来源:igfitidea点击:

Returning jbyteArray from native c in Android

androidcandroid-ndkjava-native-interface

提问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 GetByteArrayElementseg:



也可以使用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, GetByteArrayElementsand ReleaseByteArrayElements.

有关SetByteArrayRegion,GetByteArrayElements和 的更多详细信息,请参见此处ReleaseByteArrayElements


NB:this question is probably a special case of this question


注意:这个问题可能是一个特例,这个问题