简介

在使用NDK开发过程中,对于我们声明的native方法,都是需要进行静态注册的,实现的方法可以是根据类型签名的规范进行实现,也可以使用javah来帮我们自动生成。自己手写的方式,很容易一不小心就写错了,所以一般都是使用javah的方式,我们之前在使用的时候,步骤都是这样子的,

javac com/example/Test.java
javah com.example.Test

然后将在当前目录生成的头文件拷贝到对应的位置,虽然也能够减小出错的概率,但是流程上还是比较繁琐复杂。
其实AS为我们提供了更加快捷方便,不易出错的实现方式,只需简单配置即可。

例子

譬如下面的例子,我们在JniData声明了我们需要使用到的两个jni方法,中间就是自动生成的头文件。那这个文件是怎样生成的呢?

java生成文件开头注释 java生成jni头文件_java生成文件开头注释

配置

快捷键commend + ,调出设置界面,选择Tool–External Tools,选择 “+”进行新增,

java生成文件开头注释 java生成jni头文件_jni_02

根据自己的喜好填写 Name、Group、Description参数,另外几个重要的参数,需要按照规范来。

  • 1、Program

填写javah即可,表示使用javah命令

  • 2、Arguments
我这里填写的是-v -jni -d $ModuleFileDir$/src/main/cpp/head $FileClass$,表示在main里面的cpp路径下创建head文件夹,并存放生成的头文件。

java生成文件开头注释 java生成jni头文件_java生成文件开头注释_03


各个参数的含义如图,其中-cp 和-classpath 其实是同个配置,只不过前者是后者的缩写而已,

ModuleFileDir

表达当前的工程目录。

  • 3、Working dirctory

工作目录,填写$SourcepathEntry$即可,表示你的源码目录位置。

使用

选中需要生成头文件的类,右键选择ExternalTools,选择我们添加的javah,之后就可以看到在对应的目录已经生成所需要的头文件了。

java生成文件开头注释 java生成jni头文件_android_04

其他

在使用的过程中,当jni里面遇到用了一个Android里面的类,会出现报错,找不到类的情况。这是因为我们没有配置classpath到Arguments里面,只需要新增对应的环境变量即可。

-classpath "$Classpath$:$ModuleFileDir$/src/main/java" -v -jni -d $ModuleFileDir$/src/main/cpp/head $FileClass$

如上,路径使用""包括起来,如果有多个路径的情况,需要以:进行分割。