如何使用jni在c++中将数据从javaInputStream移动到char*

How to move data from java InputStream to a char * in c++ with jni?

本文关键字:javaInputStream 移动 char 数据 jni 何使用 c++      更新时间:2023-10-16

如何使用JNI将存储在java InputStream中的数据移动到c++中的char*?

谢谢,卡洛斯。

这是java代码

InputStream is = new FileInputStream("filename");
int numBytesToRead = 1024;
byte[] inBuffer = new byte[numBytesToRead];
int bytesRead = is.read(inBuffer, 0, numBytesToRead);
decodeAacBytes(inBuffer, bytesRead);

jni代码是

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,从ByteArrayOutput流中获取byte[],并从byte[]创建String。

这是不可能的。以下是我的发现:

jclass x = env->FindClass("java/io/InpuStream");
jclass y = env->FindClass("java/util/BitSet"); 

以上是C++代码背后的内容。当我追踪时,xNULL,而y不是。因此,InputStream不能具体化为C++ JNI代码。但BitSet可以。我知道,因为我一直在使用它。

来自java:

{
        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:

{
JNIEXPORT jbyteArray JNICALL Java_org_alok_jni_AlokJNI_setByteArray
  (JNIEnv * env, jclass this1, jbyteArray ba, jint len) {
memcpy(my_char_array, ba, len);
}