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?
你不知道。这不是铸造操作。您必须使用 来创建一个 Java 字节数组对象,NewByteArray()并通过 来使用原始 C 数据设置元素SetByteArrayRegion()。
您会注意到,jbyteArray 可以转换为 uint8_t *,因为我将一个作为参数传递给
initializeProduct()
不合逻辑的推论。仅仅因为你可以投射某些东西并不意味着它实际上就变成了那样。您需要使用GetByteArrayElements() 或从 C 代码GetByteArrayRegion()中获取数据,然后在完成后进行适当的调用。jbyteArrayReleaseXXX()
| 归档时间: |
|
| 查看次数: |
4084 次 |
| 最近记录: |