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

Kotlin JNI中Long类型对应的JNI类名是什么

问题原因与对应规则

非空的Kotlin Long 类型编译到JVM平台时,默认对应Java基本类型long,而非包装类java.lang.Long,这就是你用java/lang/Long作为参数类型查找方法失败的核心原因。

你之前无参版本的返回值Integer能被java/lang/Integer匹配,是因为这里的Integer本身就是Java包装类类型;如果你把返回值换成Kotlin内置的非空Int,编译后会变成Java基本类型int,再用java/lang/Integer反而会匹配失败。

Kotlin JVM的类型映射核心规则很明确:

  • 非空的内置数值类型(Long/Int/Short/Byte/Float/Double/Char/Boolean),除了泛型装箱场景外,编译后默认映射为Java对应的基本类型,不会生成包装类
  • 只有声明为可空类型(比如Long?),或者显式指定类型为java.lang.Long时,才会对应Java的Long包装类
JNI开发的正确处理方式

针对不同的Long场景,匹配方式不一样:

  • 非空Kotlin Long(对应Java基本类型long)
    查找方法时不需要调用FindClass找Long类,直接在方法签名里使用基本类型描述符J即可。
    比如你修改后的方法:
    @JvmStatic external fun registerNativeWindowFromSurface(id: Long): Integer;
    
    它的标准JNI方法签名是(J)Ljava/lang/Integer;,调用GetStaticMethodID时直接传入这个签名就能正确匹配到方法。
  • 可空Long?/显式java.lang.Long(对应Java包装类Long)
    这时候才需要用FindClass("java/lang/Long")获取类引用,方法签名里对应Ljava/lang/Long;。

如果拿不准签名不要硬猜,最稳妥的方式是编译完Kotlin代码后,用javap -s -p 对应类名.class命令直接查看字节码里的方法描述符,输出的内容可以直接复制到JNI代码里用,不会出现类型不匹配的问题。

内容的提问来源于stack exchange,提问作者PPP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:51:26