概述:
最近在寫c++/c的一個小的項目,需要打成動態庫,供java使用。就對java 調用c++/c代碼做了簡答瞭解,在此做記錄。jni開發第一步,就是用javah命令生成生成c\c++頭文件。
javah命令參數詳解
cmd(默認配置jdk path) 執行javah -help 如下圖:
-d 和-o
這兩個參數用於設置生成的C\C++頭文件的指定,該兩參數選項不能同時使用,-d是爲中的每個有JNI方法的java類都生成一個頭文件,並存放在-d指定的目錄中,-o則是生成的所有JNI方法的頭文件都放在-o指定的文件中。
-jin
表示用於生成JNI風格的C\C++頭文件,默認該參數就是開啓的。
-classpath
使用-classpath後JDK將不再使用CLASSPATH中的類搜索路徑,如果-classpath和CLASSPATH都沒有設置,則JDK使用當前路徑(.)作爲類搜索路徑。
推薦使用-classpath來定義JDK要搜索的類路徑,而不要使用環境變量CLASSPATH的搜索路徑,以減少多個項目同時使用CLASSPATH時存在的潛在衝突。例如應用1要使用a1.0.jar中的類G,應用2要使用 a2.0.jar中的類G,a2.0.jar是a1.0.jar的升級包,當a1.0.jar,a2.0.jar都在CLASSPATH中,JDK搜索到第一個包中的類G時就停止搜索,如果應用1應用2的虛擬機都從CLASSPATH中搜索,就會有一個應用得不到正確版本的類G。
-verbose
該參數,將顯示javah命令搜索和裝置類文件的詳細過程。
例子1
新建一個含有native方法的java類:
public class HelloWorld{
static {
System.load("D://jni//h//hello//x64//Debug//hello.dll");//載入dll Connector.dll
//D:\jni\h\hello\x64\Debug
}
public static void main(String args []){
HelloWorld helloWord = new HelloWorld();
helloWord.sayHello("nihao");
}
public native void sayHello(String name);
}
切換到HelloWorld.java所在目錄,執行javac HelloWorld.java命令 在本目錄會生成HelloWorld.class文件
執行javah -o .\myjni -classpath .\ -jni HelloWorld** 會在當前目錄生成名字爲myjni.h頭文件
執行javah -d .\jni -classpath .\ -jni HelloWorld 會在當前目錄新建一個jni目錄,並在jni目錄生成一個HelloWorld.h頭文件
注意一定是在HelloWorld.java所在目錄執行以上命令
例子2:
1、D:\jni\helloWorld目錄 創建src目錄,並創建com\wei子目錄。
2、D:\jni\helloWorld\src\com\wei創建HelloWorld.java Test.java。
HelloWorld.java
package com.wei;
public class HelloWorld {
public native String getHelloString();
}
Test.java
package com.wei;
public class Test{
public native String TestJni();
}
3、在D:\jni\HelloWorld目錄新建一個src.txt文本描述,和一個myClass空目錄,打開cmd命令,並切換到D:\jni\helloWorld目錄,執行 javac命令
src.txt
src\com\wei\HelloWorld.java
src\com\wei\Test.java
執行命令後會在myClass目錄生成com\wei\ HelloWorld.class Test.class
4、在D:\jni\HelloWorld目錄新建一個myClass.txt有關類文本描述,打開cmd命令,並切換到D:\jni\helloWorld目錄,執行 javah命令
myClass.txt
com.wei.HelloWorld
com.wei.Test
執行命令後會在./jni 目錄生成以上兩個類的頭文件。
到此我相信大家再也不會爲生成jni頭文件而不知所措了,下一篇我會整理一下,在android studio上生成頭文件的方法。
希望對您有所幫助!