当前位置: 首页 > 工具软件 > kotlin-native > 使用案例 >

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

边健
2023-12-01

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 { } 中。

 类似资料: