How to move data from java InputStream to a char * in c++ with jni?
如何使用JNI将java InputStream中存储的数据移动到c ++中的char *?
谢谢,
卡洛斯
这是java代码
1 2 3 4 5 6 7 | InputStream is = new FileInputStream("filename"); int numBytesToRead = 1024; byte[] inBuffer = new byte[numBytesToRead]; int bytesRead = is.read(inBuffer, 0, numBytesToRead); decodeAacBytes(inBuffer, bytesRead); |
JNI代码是
1 2 3 4 5 6 7 8 9 10 | jint Java_com_example_test_MainActivity_decodeAacBytes(JNIEnv * env, jobject this, jbyteArray input, jint numBytes) { //copy bytes from java jbyte* bufferPtr = (*env)->GetByteArrayElements(env, input, NULL); char *inputBytes = malloc(numBytes * sizeof(char)); memcpy(inputBytes, bufferPtr, numBytes); (*env)->ReleaseByteArrayElements(env, input, bufferPtr, 0); return 0; } |
现在值将在inputBytes数组中
我不知道是否可以将InputStream之类的对象传递给JNI,但是可以传递一个String。
诀窍是在进行JNI调用之前先用Java获取char []。 您可以将InputStream的内容复制到ByteArrayOutputStream,从ByteArrayOutputStream获取byte [],然后从byte []创建String。
从Java:
1 2 3 4 5 6 7 8 9 10 | { InputStream inputStream = rcvStream; byte[] inData = new byte[1024]; int bytesRead = inputStream.read(); byte[] actualData = new byte[bytesRead]; System.arraycopy(inData, 0, actualData, 0, bytesRead); jni.setByteArray(inData, bytesRead); } |
从C:
1 2 3 4 5 6 7 | { JNIEXPORT jbyteArray JNICALL Java_org_alok_jni_AlokJNI_setByteArray (JNIEnv * env, jclass this1, jbyteArray ba, jint len) { memcpy(my_char_array, ba, len); } |