Kotlin 和 Java 中内部类中的 static native 方法(JNI 函数)

Java 内部类中的 static native 方法

package com.example.app;

public class JavaClass {
    static {
        System.loadLibrary("mylib");
    }
    static class Native {
        public static native byte[] encrypt(byte[] str);
    }
}

对应的 JNI 函数为:

JNIEXPORT jbyteArray JNICALL
Java_com_example_app_JavaClass_00024Native_encrypt(
    JNIEnv *env, jclass clazz, jbyteArray bytes) {
    // TODO: implement encrypt()
}

其中 ,Java_com_example_app_JavaClass_00024Native_encrypt 的名字解析:

  • Java_ JNI 函数前缀
  • com_example_app_JavaClass_00024Native 为内部类 com.example.app.JavaClass$Native
  • _ 是分隔符,类名 com.example.app.JavaClass$Native 和 Java 方法名 encrypt 之间的分隔符
  • encrypt 对应 Java 方法名

com_example_app_JavaClass_00024Native 中的 _00024 的意思:
_00024_00024 两部分组成,
_0 表示这是一个转义字符,
0024 是Unicode字符 $,即内部类的连接符

参考: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp615

转义解释
_0XXXX表示 Unicode 字符 XXXX ,
通常用小写字母表示,
例如,使用小写字母的 _0abcd,而不是 _0ABCD

Kotlin companion object 中的静态的 native 方法

package com.example.app

class KotlinClass {
    companion object {
        init {
            System.loadLibrary("mylib");
        }

        external fun encrypt(bytes: ByteArray): ByteArray?
    }
}

对应的 JNI 函数:

JNIEXPORT jbyteArray JNICALL
Java_com_example_app_KotlinClass_00024Companion_encrypt(
    JNIEnv *env, jobject thiz, jbyteArray bytes) {
    // TODO: implement encrypt()
}

其中, 对 Java_com_example_app_KotlinClass_00024Companion_encrypt 的解析:

  • Java_ JNI 函数前缀
  • com_example_app_KotlinClass_00024Companion 为内部类 com.example.app.KotlinClass$Companion
  • _ 是分隔符,类名 com.example.app.KotlinClass$Companion 和 Kotlin 方法名 encrypt 之间的分隔符
  • encrypt 对应 Kotlin 方法名

Java 中的 static 变量,static Java 方法,在 Kotlin 中,放到 companion object { } 中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值