java - 如何将 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
?
解决方案
你没有。这不是铸造操作。您必须创建一个 Java 字节数组对象,使用NewByteArray()
,并使用原始 C 数据通过SetByteArrayRegion()
.
您会注意到 jbyteArray 可以转换为 uint8_t * 因为我将一个作为参数传递给
initializeProduct()
不合逻辑的推论。仅仅因为你可以施放某些东西并不意味着它实际上会变成那样。您需要使用GetByteArrayElements()
或从C 代码GetByteArrayRegion()
中获取数据,然后在完成后进行适当的调用。jbyteArray
ReleaseXXX()
推荐阅读
- javascript - Chartist 未在 Nuxt 的阈值插件中定义
- java - 单元测试因 NullPoiterException 而失败
- windows - 如何使用 Cmdkey.exe /list powershell 脚本报告 Office 应用程序中的 microsoft 帐户许可证?
- azure-logic-apps - 如何在表达式中使用整数运算?
- heroku - 是否可以将 Heroku 日志排放设置为仅“排放”应用程序日志?
- python - Discord Py,通过 ID 在任何通道中发送消息
- r - 如何在具有多个条件的 R 中应用 RLE() 函数?
- flutter - 在设备启动时运行后台服务
- c - 3 x 3 网格的阿贝尔沙堆的特征是什么?
- docker - docker:如何在 shell 入口点“sh -c”中使用 shell 变量?