java - Android:从 C++ 调用带有 byte[] 参数的 java 方法
问题描述
我是一名 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);
}
推荐阅读
- terraform - 资源:aws_s3_bucket_public_access_block 抱怨根模块
- c# - 如何回调自定义控件WPF中的代码
- flutter - 有什么方法可以滚动到 Flutter 列表视图中的某个位置
- ios - 如何根据 SwiftUI 中的输入更改 TextField 状态?
- python - 如果 Python 中缺少主列中的值,是否可以将值附加到列?
- decimal - 如何在 Scilab 中求解具有十进制度数的多项式?
- python - 在 multiIndex 中选择多个键
- java - 抽象类 getter 和 setter 用法 [V2]
- sql - 如何在sql中的条件下具有单个列的不同值?
- api - 颤振:未处理的异常:无效的参数