首页 > 解决方案 > 如何将 uint8_t * 转换为 jbyteArray jni 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;
}

initializeProduct返回一个uint8_t *

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

byte[] defend = (byte[]) initializeProduct(bufferByteArray);

您会注意到 ajbyteArray可以转换为 auint8_t *因为我将一个作为参数传递给initializeProduct. 单步执行 c 代码,我可以确认这是真的。

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

标签: javaandroidjava-native-interface

解决方案


你没有。这不是铸造操作。您必须创建一个 Java 字节数组对象,使用NewByteArray(),并使用原始 C 数据通过SetByteArrayRegion().

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

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


推荐阅读