我是一名Android开发人员,并且是JNI的新手,我想要做的是将字节数组从c ++方法传递给java方法。这是我的c ++方法的样子:
void func(char* bytes)
{
jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);
jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");
jbyteArray array = fJNIEnv->NewByteArray(sizeof(bytes));
fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes);
fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);
}
这是javaFunc方法:
public void javaFunc(byte[] bytes) {
...
}
当我调试func方法时,bytes
指向一个字符数组,但是当我使用javaFunc
方法时,bytes
类似于{16,0 ,0,0}-完全没有必要。任何帮助将不胜感激。
答案 0 :(得分:2)
您的SetByteArrayRegion
呼叫是错误的。
fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes);
应该是
fJNIEnv->SetByteArrayRegion(fJNIEnv, array, 0, number of bytes, (jbyte *) bytes);
语法是:
SetByteArrayRegion(env, byteArray, from, size, a + from);
答案 1 :(得分:2)
使用sizeof(bytes)
是错误的。这样就可以得到char*
指针本身的字节大小(32位为4,64位为8),而不是所指向的数据的字节大小。
您需要更改func()
来传递数组中char
的数量。然后,您可以在分配和填充JNI数组时使用该数字。
此外,您需要在CallNonvirtualVoidMethod()
退出后释放JNI数组。
尝试一下:
void func(char* bytes, int numBytes)
{
jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);
jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");
jbyteArray array = fJNIEnv->NewByteArray(numBytes);
fJNIEnv->SetByteArrayRegion(array, 0, numBytes, (jbyte *) bytes);
fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);
fJNIEnv->DeleteLocalRef(array);
}
或者,传入一个更合适的C ++容器,例如std::vector<char>
:
void func(const std::vector<char> &bytes)
{
jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);
jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");
jbyteArray array = fJNIEnv->NewByteArray(bytes.size());
fJNIEnv->SetByteArrayRegion(array, 0, bytes.size(), (jbyte *) bytes.data());
fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);
fJNIEnv->DeleteLocalRef(array);
}