java - 如何访问 jni 中 jobjectarray 中的元素

标签 java java-native-interface

我有一个 java 方法,它从我的 native 方法调用,并向 native 代码返回一个对象数组。

对象数组的元素设置为,

  Object[] arr = new Object[10];
    arr[0] = new Integer(12);
    arr[1] = new Float(25.5f);

我在 native 代码中收到此数组,如下所示,

  jobjectArray a = (jobjectArray)(*env)->CallStaticObjectMethodA(env, <class_id>, <method_id>, <parameter_list>);

我将每个元素的数据类型存储在对象数组中。那么根据数据类型,我如何在 native 方法中访问相应的整数和浮点值。

我尝试了以下方法,

 jobject obj = (*env)->GetObjectArrayElement(env, a, 0);
    int num = (jint)obj;

但是设置为 num 的值不正确。

最佳答案

当您将Integer 转换为int 时,Java 会自动拆箱。但这种机制在 C 中不存在。您所做的就是获取元素的内存地址并将其解释为 int

如果您想在 C 端从 Integer 获取 int,则必须调用 intValue:

jobject objInteger = (*env)->GetObjectArrayElement(env, a, 0);    

jclass cInteger = (*env)->FindClass(env, "java/lang/Integer");
jmethodID intValue = (*env)->GetMethodID(env, cInteger, "intValue", "()I");
int i = (*env)->CallIntMethod(env, objInteger, intValue);

关于java - 如何访问 jni 中 jobjectarray 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42315399/

相关文章:

Java 检查异常不在函数的抛出规范中?

Java如何限制一行打印的字符数

java - 在 java.sql.SQLException : General error 中获取时间戳结果

java - 是否可以在 Android 上创建符号链接(symbolic link)?

Java REST API : Can not deserialize instance of Object out of START_ARRAY token

java - JNI 不适用于 __stdcall

java - 在后台线程上创建一个 RealmQuery

java-native-interface - 强制 GC 收集 JNI 代理对象

java - 如果 jvm 的参数是从其他类型转换过来的,jni 找不到类

java - 如何通过 JVMTI 接口(interface)使用 jmethod id 获取声明该方法的类