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即可。
比如你修改后的方法:
它的标准JNI方法签名是@JvmStatic external fun registerNativeWindowFromSurface(id: Long): Integer;(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
相关产品推荐
相关产品推荐

