我正在开发一个使用一些 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 *
.如果我理解正确,那么我应该能够将返回值转换为
jbyteArray
然后能够将其分配给 byte[]
在我的一个 java 类中。然而,这种情况并非如此。byte[] defend = (byte[]) initializeProduct(bufferByteArray);
您会注意到
jbyteArray
可以转换为 uint8_t *
因为我将一个作为参数传递给 initializeProduct
.单步执行 c 代码,我可以确认这是真的。转换/转换的正确方法是什么
uint8_t *
至jbyteArray
?
最佳答案
Chrome 源中的类似代码:ToJavaByteArray() ,希望这些代码可以帮助到你。
ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
const uint8_t* bytes,
size_t len) {
jbyteArray byte_array = env->NewByteArray(len);
CheckException(env);
DCHECK(byte_array);
env->SetByteArrayRegion(
byte_array, 0, len, reinterpret_cast<const jbyte*>(bytes));
CheckException(env);
return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
}
关于java - 如何将 uint8_t * 转换为 jbyteArray jni android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381556/