当前位置: 首页 > 知识库问答 >
问题:

如何将uint8_t*强制转换为jbyteArray jni android

袁帅
2023-03-14

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

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

错误:JNI检测到应用程序中的错误:使用了无效的jobject 0x7D61E62000

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;
}

如果我正确理解,那么我应该能够将返回值强制转换为JByteArray,然后能够将其分配给我的一个java类中的Byte[]。然而,事实并非如此。

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

您将注意到,可以将JByteArray强制转换为UINT8_T*,因为我将其作为参数传入InitializeProduct。通过执行c代码,我可以确认这是真的。

uint8_t*转换/强制转换为JByteArray的正确方法是什么?

共有1个答案

袁法
2023-03-14

你不知道。这不是铸造手术。您必须使用newByteArray()创建Java字节数组对象,并通过setByteArrayRegion()使用原始C数据设置元素。

您将注意到,可以将jbyteArray强制转换为uint8_t*,因为我将其作为参数传入initializeProduct()

非序列。只是因为你能投一些东西并不意味着它实际上变成了那样。您需要使用GetByteArrayElements()GetByteArrayRegion()JByteArray中获取C代码的数据,完成后再执行适当的ReleasExxx()调用。

 类似资料:
  • 我试图用scala编写一个udf函数,并在pyspark工作中使用它。我的数据帧模式是 我正在尝试编写一个udf函数 在这个map函数中,我试图将行强制转换为case类,但无法。我犯了这个错误。 java.lang.ClassCast异常:org.apache.spark.sql.catalyst.expressions.GenericRowwith模式不能强制转换为变量计算变量计算$myRow3

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 问题内容: 我有MainActivity类,该类具有实例化ApplicationBar的方法,所有其他Activity都从此继承,因此他们可以使用此方法。 但是我也有一个MapHolder类,它必须从xml中扩展,因为它使用来显示地图。问题是如果我从不显示ApplicationBar选项卡扩展它,并且从MainActivity扩展它而不显示地图,则出现此错误: 问题答案: 您正在尝试将a强制转换为

  • 问题内容: 我收到以下异常。 造成原因: java.lang.ClassCastException:无法将java.math.BigInteger强制转换为java.lang.Integer 用下面的代码 在这条线 有人知道吗? 问题答案: 您可以使用: 或者也许覆盖了和价值观。

  • 问题内容: 我长期困扰这个问题。我有一段时间搜索此问题,但没有解决方案。 结构体: 我也用我 在我的。 请提供有关如何解决此问题的一些信息。 问题答案: 从中删除注释并使其: 发生您的问题是因为的特化,这意味着Spring将尝试创建注入实例。由于superclass()不是通用的,因此您无法将其向下转换为,因此这行代码将失败(与尝试使用手动实例化该代码的方式相同): 专业课仍应使用注释。当spri

  • 问题内容: 我有一个将对象作为输入的方法,如果输入是instanceOF Long,则将值转换为double值。下面是代码: 但是当我执行上面的代码时,我得到下面的异常: 请让我知道为什么它给了我例外。 但是,如果直接尝试将Long对象转换为double,则不会发生classCast异常。 这很混乱。 问题答案: 在JLS中找到了解释,请 参见表5.1 下的https://docs.oracle.