简介
在使用NDK开发过程中,对于我们声明的native方法,都是需要进行静态注册的,实现的方法可以是根据类型签名的规范进行实现,也可以使用javah来帮我们自动生成。自己手写的方式,很容易一不小心就写错了,所以一般都是使用javah
的方式,我们之前在使用的时候,步骤都是这样子的,
javac com/example/Test.java
javah com.example.Test
然后将在当前目录生成的头文件拷贝到对应的位置,虽然也能够减小出错的概率,但是流程上还是比较繁琐复杂。
其实AS为我们提供了更加快捷方便,不易出错的实现方式,只需简单配置即可。
例子
譬如下面的例子,我们在JniData声明了我们需要使用到的两个jni方法,中间就是自动生成的头文件。那这个文件是怎样生成的呢?
配置
快捷键commend + ,
调出设置界面,选择Tool--External Tools,选择 “+”进行新增,
根据自己的喜好填写 Name、Group、Description参数,另外几个重要的参数,需要按照规范来。
- 1、Program
填写
javah
即可,表示使用javah
命令
- 2、Arguments
我这里填写的是
-v -jni -d $ModuleFileDir$/src/main/cpp/head $FileClass$
,表示在main里面的cpp路径下创建head文件夹,并存放生成的头文件。
各个参数的含义如图,其中-cp 和-classpath 其实是同个配置,只不过前者是后者的缩写而已,ModuleFileDir
表达当前的工程目录。
- 3、Working dirctory
工作目录,填写
$SourcepathEntry$
即可,表示你的源码目录位置。
使用
选中需要生成头文件的类,右键选择ExternalTools,选择我们添加的javah
,之后就可以看到在对应的目录已经生成所需要的头文件了。
其他
在使用的过程中,当jni里面遇到用了一个Android里面的类,会出现报错,找不到类的情况。这是因为我们没有配置classpath到Arguments
里面,只需要新增对应的环境变量即可。
-classpath "$Classpath$:$ModuleFileDir$/src/main/java" -v -jni -d $ModuleFileDir$/src/main/cpp/head $FileClass$
如上,路径使用""
包括起来,如果有多个路径的情况,需要以:
进行分割。