如何使用jni在c++中将数据从javaInputStream移动到char*
How to move data from java InputStream to a char * in c++ with jni?
如何使用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++
代码背后的内容。当我追踪时,x
是NULL
,而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);
}