java - 如何将 uint8_t * 转换为 jbyteArray jni android

标签 java android java-native-interface

我正在开发一个使用一些 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/

相关文章:

java - Tomcat 数据源 - 连接池

java - 比较器获取链接列表中的最大值,并从比较中排除链接列表的第一个元素

Android 8.0 蓝牙设备后台服务

java - 如何将复杂对象列表的成员与 Hamcrest 进行比较?

java - 为什么 Java 使用 'equals' 而不是 '==' 来检查对象在 Map 中的存在?

java - Android ImageView 克服线性布局

Android Studio无法下载SDK

java - 包名称破坏了 JNI 类路径?

android - 将项目添加到 C++ native 中的 ArrayList 会使单击监听器上的 android 应用程序崩溃

android - 如何在android应用程序中使用现有的.so文件