JNI中如何将jobjectArray转换为jvalue数组调用Java反射方法
结论
JNI规范没有提供官方内置的API直接完成jobjectArray到jvalue数组的转换,你需要自行实现转换逻辑。Java内部反射用到的对应逻辑属于JVM内部私有实现,没有暴露到公共JNI接口中。
简化实现参考
如果你的使用场景中所有参数都是引用类型(不包含Integer/Boolean这类基础类型包装类),可以直接用以下代码实现:
JNIEXPORT jobject JNICALL Java_pkg_Cls_nativeCallObjectMethod (JNIEnv *env, jclass ignored, jobject obj, jobject method, jobjectArray params) { // 从Method反射对象获取jmethodID jmethodID methodID = (*env)->FromReflectedMethod(env, method); // 获取参数数组长度 jsize paramCount = (*env)->GetArrayLength(env, params); // 分配对应长度的jvalue数组 jvalue *args = (jvalue *)calloc(paramCount, sizeof(jvalue)); // 遍历赋值jobject到jvalue的引用类型字段 for (int i = 0; i < paramCount; i++) { args[i].l = (*env)->GetObjectArrayElement(env, params, i); } // 调用A版本的方法执行 jobject result = (*env)->CallObjectMethodA(env, obj, methodID, args); // 释放jvalue数组内存 free(args); return result; }
特殊场景适配说明
如果参数可能包含基础类型的包装类,你需要额外做以下处理:
- 从
method反射对象中获取参数的类型签名 - 遍历参数时根据签名判断对应位置的参数是基础类型还是引用类型
- 对包装类执行拆箱操作(比如调用
intValue()方法获取Integer对象的基础int值,赋值到args[i].i字段) - 基础类型和
jvalue字段的对应关系可以参考JNI官方规范定义
内容的提问来源于stack exchange,提问作者Luke Hutchison
相关产品推荐
相关产品推荐

