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) {
}
其中 ,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 由 _0 和 0024 两部分组成, _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) {
}
其中, 对 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 { } 中。
|