Android:使用 c++ 中的 byte[] 参数调用 java 方法
Android: Calling java method with byte[] parameter from c++
我是一名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);
相关文章:
- 当对话框被接受时,如何用参数调用槽
- 使用用户定义的参数调用future/async并调用类方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 不允许运算符 const 参数调用 const 成员函数
- 为变量模板的每个参数调用模板函数
- 如何在窗口中使用注入的 dll 中的参数调用函数
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么使用不匹配的参数调用重载函数仍然有效
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 基于枚举参数调用专用模板方法
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 如何使用类模板参数来更改参数调用和函数签名?
- lambda 函数使用其参数作为模板参数调用模板函数
- Android:使用 c++ 中的 byte[] 参数调用 java 方法
- 使用不同的模板参数调用模板类的对象
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 是否可以基于类模板的参数调用类方法和全局方法
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- C++大括号初始值设定项作为参数调用不同的构造函数,然后预期