2.4.2 JNI方法命名规则

Log系统中,JNI实现方法与Java声明方法是不同的。例如,Java层声明的Native方法名是isLoggable,而其对应的JNI实现方法的方法名却是android_util_Log_isLoggable。可见,除了数据类型有对应关系外,方法名也有对应关系。

JNI接口指针是JNI实现方法的第一个参数,其类型是JNIEnv。第二个参数因本地方法是静态还是非静态而有所不同。非静态本地方法的第二个参数是对Java对象的引用,而静态本地方法的第二个参数是对其Java类的引用。其余的参数都对应于Java方法的参数。

JNI规范里提供了JNI实现方法的命名规则,方法名由以下几部分串接而成:

Java_前缀

全限定的类名

下划线(_)分隔符

增加第一参数JNIEnv*env

增加第二个参数jobject

其他参数按类型映射

返回值按类型映射

继续以Log系统为例讲解。Java部分方法声明如下:


public static native boolean isLoggable(String tag, int level);


JNI部分方法实现如下:


static jboolean android_util_Log_isLoggable(JNIEnv*env, jobject clazz,



jstring tag, jint level){……}


从Log系统的JNI实现方法看到,Android并没有严格遵守JNI的方法命名规范。

注意 Android在框架层采用函数注册的方式,建立Java层声明方法与JNI层实现方法之间的对应关系,可以不遵守上述命名规则。