为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2021-08-04 17:06:56
我是一名 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} 的东西 - 它与它必须的完全不同。任何帮助,将不胜感激。
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

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

}


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 394 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信