如何将 uint8_t * 转换为 jbyteArray jni android

luc*_*g3r 5 java java-native-interface android

我正在开发一个使用一些 C/C++ 代码的 Android 库。

我显然有某种编码错误,只会在运行时出错。

错误:JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0x7d61e62000

这是我用来调用 C 代码的 JNI 代码。

JNIEXPORT jbyteArray JNICALL
Java_com_comp_complibrary_api_initializeProduct(JNIEnv *env, jobject 
                                                    instance,
                                                    jbyteArray buffer_) {
    jbyte *buffer = env->GetByteArrayElements(buffer_, NULL);

    jbyteArray rv = (jbyteArray) initializeProduct((uint8_t *) buffer);

    env->ReleaseByteArrayElements(buffer_, buffer, 0);

    return rv;
}
Run Code Online (Sandbox Code Playgroud)

initializeProduct返回一个uint8_t *.

如果我理解正确,那么我应该能够将返回值转换为 a jbyteArray,然后能够将其分配给byte[]我的一个 java 类中的 a。然而,这种情况并非如此。

byte[] defend = (byte[]) initializeProduct(bufferByteArray);
Run Code Online (Sandbox Code Playgroud)

您会注意到,当我将 1 作为参数传递给 时, ajbyteArray可以转换为 a 。单步执行 C 代码我可以确认这是真的。uint8_t *initializeProduct

uint8_t *转换/转换为的正确方法是什么jbyteArray

use*_*421 1

你不知道。这不是铸造操作。您必须使用 来创建一个 Java 字节数组对象,NewByteArray()并通过 来使用原始 C 数据设置元素SetByteArrayRegion()

您会注意到,jbyteArray 可以转换为 uint8_t *,因为我将一个作为参数传递给initializeProduct()

不合逻辑的推论。仅仅因为你可以投射某些东西并不意味着它实际上就变成了那样。您需要使用GetByteArrayElements() 或从 C 代码GetByteArrayRegion()中获取数据,然后在完成后进行适当的调用。jbyteArrayReleaseXXX()