15.3.2. JNI 头文件

优质
小牛编辑
127浏览
2023-12-01

15.3.2.JNI 头文件

接下来需要做的首先是,创建相应的JNI头文件。这需要用到一个Java的标准工具,也就是javah。它附带在JDK中,你可以在JDK/bin中找到它。

跳转到项目的bin目录,执行:

[Fibonacci/bin]> javah -jni com.marakana.FibLib

javah -jni取一个类名作为参数。需要注意,不是所有的类都默认处于Java的Classpath中,因此切换到项目的bin目录再执行这条命令是最简单的方法。在这里,我们假设当前目录已经在Classpath中,保证javah -jni com.marakana.FibLib能够正确地加载对应的类。

上述命令会生成一个文件com_marakana_FibLib.h,它就是供我们引用的头文件。

在编写本地代码之前,我们需要先整理一下项目目录。Eclipse可以帮助我们完成许多工作,但它还没有提供NDK的相关支持,因此这些步骤需要手工完成。

首先,在项目目录下新建一个目录jni,用来存放本地代码和相关的文件。你可以在Eclipse的Package Explorer中右击FibLib项目,选择New→Folder。

然后把新生成的头文件移动到这个目录:

[Fibonacci/bin]> mv com_marakana_FibLib.h ../jni/

看一下刚刚生成的文件:

include::code/Fibonacci/jni/com_marakana_FibLib.h

这个文件是自动生成的,我们不需要也不应手工修改它。你可以在里面见到待实现函数的签名:

...

JNIEXPORT jlong JNICALL Java_com_marakana_FibLib_fibN

(JNIEnv *, jclass, jlong);

...

JNIEXPORT jlong JNICALL Java_com_marakana_FibLib_fibNI

(JNIEnv *, jclass, jlong);

...

这便是JNI的标准签名。它有着某种命名规范,从而将这些函数和com.marakana.FibLib中的native方法关联起来。可以留意其中的返回值是jlong,这是JNI中标准的整数类型。

这些参数也同样有意思:JNIEnv、jclass、jlong。所有的JNI函数都至少有着前两个参数:第一个参数JNIEnv指向Java VM的运行环境,第二个参数则表示着函数属于的类或者实例。如果属于类,则类型为jclass,表示它是一个类方法;如果属于实例,则类型为jobject,表示它是一个实例方法。第三个参数jlong,则表示菲波那契算法的输入,也就是参数n。

好,头文件已准备完毕,接下来就可以实现C函数了。