如何使用jni在c ++中将数据从java InputStream移到char *?

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

}