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
由 _0
和 0024
两部分组成,
_0
表示这是一个转义字符,
0024
是Unicode字符 $
,即内部类的连接符
参考: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp615
转义 | 解释 |
---|---|
_0XXXX | 表示 Unicode 字符 XXXX , 通常用小写字母表示, 例如,使用小写字母的 _0abcd,而不是 _0ABCD |
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 { }
中。