猿问

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} 的东西 - 它与它必须的完全不同。任何帮助,将不胜感激。


江户川乱折腾
浏览 395回答 2
2回答

jeck猫

使用sizeof(bytes)是错误的。这为您提供了char*指针本身的字节大小(32 位中 4 个,64 位中 8 个),而不是所指向数据的字节大小。您需要更改func()以传入char数组中s的数量。然后,您可以在分配和填充 JNI 数组时使用该数字。此外,您需要在CallNonvirtualVoidMethod()退出后释放 JNI 数组。试试这个:void func(char* bytes, int numBytes){&nbsp; &nbsp; jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);&nbsp; &nbsp; jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");&nbsp; &nbsp; jbyteArray array = fJNIEnv->NewByteArray(numBytes);&nbsp; &nbsp; fJNIEnv->SetByteArrayRegion(array, 0, numBytes, (jbyte *) bytes);&nbsp; &nbsp; fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);&nbsp; &nbsp; fJNIEnv->DeleteLocalRef(array);}或者,传入一个更合适的 C++ 容器,例如std::vector<char>:void func(const std::vector<char> &bytes){&nbsp; &nbsp; jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);&nbsp; &nbsp; jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");&nbsp; &nbsp; jbyteArray array = fJNIEnv->NewByteArray(bytes.size());&nbsp; &nbsp; fJNIEnv->SetByteArrayRegion(array, 0, bytes.size(), (jbyte *) bytes.data());&nbsp; &nbsp; fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);&nbsp; &nbsp; fJNIEnv->DeleteLocalRef(array);}
随时随地看视频慕课网APP

相关分类

Java
我要回答