gpt4 book ai didi

java - Android:从 C++ 调用带有 byte[] 参数的 java 方法

转载 作者:搜寻专家 更新时间:2023-11-01 07:42:50 25 4
gpt4 key购买 nike

我是一名 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 的数量s 在数组中。然后,您可以在分配和填充 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);
}

关于java - Android:从 C++ 调用带有 byte[] 参数的 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51956276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com