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

标签 java android c++ arrays java-native-interface

我是一名 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 code> 类似于 {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/

相关文章:

java - 使用crawler4j下载js文件

java.net.URLDecoder 依赖源文件编码?

java - 如何在Java中使用GSON转换JSON对象?

c++ - std::remove_if 是否调用析构函数?

android - 如何在 Android 上的崩溃转储中获得更多调用堆栈深度?

java - 收到远程通知后扫描 iBeacon

java - 使用堆栈和队列对数组进行排序

java - VideoView的setVideoPath和setVideoURI有什么区别

android - 在 OpenGL ES Android 中加载模型的最快方法是什么?

c++ - 连续计算器程序的段错误