簡(jiǎn)介
在使用NDK開(kāi)發(fā)過(guò)程中,對(duì)于我們聲明的native方法笔呀,都是需要進(jìn)行靜態(tài)注冊(cè)的幢踏,實(shí)現(xiàn)的方法可以是根據(jù)類型簽名的規(guī)范進(jìn)行實(shí)現(xiàn),也可以使用javah來(lái)幫我們自動(dòng)生成许师。自己手寫的方式房蝉,很容易一不小心就寫錯(cuò)了,所以一般都是使用javah
的方式微渠,我們之前在使用的時(shí)候搭幻,步驟都是這樣子的,
javac com/example/Test.java
javah com.example.Test
然后將在當(dāng)前目錄生成的頭文件拷貝到對(duì)應(yīng)的位置逞盆,雖然也能夠減小出錯(cuò)的概率檀蹋,但是流程上還是比較繁瑣復(fù)雜。
其實(shí)AS為我們提供了更加快捷方便云芦,不易出錯(cuò)的實(shí)現(xiàn)方式续扔,只需簡(jiǎn)單配置即可。
例子
譬如下面的例子焕数,我們?cè)贘niData聲明了我們需要使用到的兩個(gè)jni方法纱昧,中間就是自動(dòng)生成的頭文件。那這個(gè)文件是怎樣生成的呢堡赔?
配置
快捷鍵commend + ,
調(diào)出設(shè)置界面识脆,選擇Tool--External Tools,選擇 “+”進(jìn)行新增,
根據(jù)自己的喜好填寫 Name善已、Group灼捂、Description參數(shù),另外幾個(gè)重要的參數(shù)换团,需要按照規(guī)范來(lái)悉稠。
- 1、Program
填寫
javah
即可艘包,表示使用javah
命令
- 2的猛、Arguments
我這里填寫的是
-v -jni -d $ModuleFileDir$/src/main/cpp/head $FileClass$
,表示在main里面的cpp路徑下創(chuàng)建head文件夾想虎,并存放生成的頭文件卦尊。
各個(gè)參數(shù)的含義如圖,其中-cp 和-classpath 其實(shí)是同個(gè)配置舌厨,只不過(guò)前者是后者的縮寫而已岂却,ModuleFileDir
表達(dá)當(dāng)前的工程目錄。
- 3、Working dirctory
工作目錄躏哩,填寫
$SourcepathEntry$
即可署浩,表示你的源碼目錄位置。
使用
選中需要生成頭文件的類扫尺,右鍵選擇ExternalTools筋栋,選擇我們添加的javah
,之后就可以看到在對(duì)應(yīng)的目錄已經(jīng)生成所需要的頭文件了。
其他
在使用的過(guò)程中器联,當(dāng)jni里面遇到用了一個(gè)Android里面的類二汛,會(huì)出現(xiàn)報(bào)錯(cuò),找不到類的情況拨拓。這是因?yàn)槲覀儧](méi)有配置classpath到Arguments
里面肴颊,只需要新增對(duì)應(yīng)的環(huán)境變量即可。
-classpath "$Classpath$:$ModuleFileDir$/src/main/java" -v -jni -d $ModuleFileDir$/src/main/cpp/head $FileClass$
如上渣磷,路徑使用""
包括起來(lái)婿着,如果有多個(gè)路徑的情況,需要以:
進(jìn)行分割醋界。