Android:使用 c++ 中的 byte[] 参数调用 java 方法

Android: Calling java method with byte[] parameter from c++

本文关键字:参数 调用 java 方法 byte 使用 c++ 中的 Android      更新时间:2023-10-16

我是一名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} - 它与它必须的样子完全不同。任何帮助将不胜感激。

使用sizeof(bytes)是错误的。这为您提供了char*指针本身的字节大小(32 位为 4,64 位为 8(,而不是指向的数据的字节大小。

您需要更改func()以传入数组中的char个数。 然后,您可以在分配和填充 JNI 数组时使用该数字。

此外,您需要在退出后释放 JNICallNonvirtualVoidMethod()数组。

试试这个:

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

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