You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:02