在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; } 

它是如何完成的?

  • 本机代码 - 如何以编程方式获取函数调用堆栈(回溯)
  • Android ndk:使用jni从c ++调用Java方法的问题
  • 使用FFMPEG和JNI压缩video
  • 如何使用NDK定位多个架构?
  • UnsatisfiedLinkError(未find本地方法)
  • 使用Android本机Binder发送自定义对象
  • 使用FFMPEG和JNI压缩video
  • 如何在eclipse中删除Android项目的本机支持,因为eclipse在jni中显示错误?
  • 使用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更多详细信息, 请参阅此处 。

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