【參考文章】:javah javac 命令行生成native的方法教程
【參考文章】:用javah 導出類的頭文件, 常見的錯誤及正確的使用方法
項目需要調用 C++動態庫,由於項目包結構發生變化,需要重新生成本地方法的頭文件,記錄一下基本使用方法。
1. 使用 javac 生成 JNI 頭文件
1.1 基本使用方法
1. JDK版本必須在 1.8 以上
2. 執行命令 javac -encoding utf8 -h targetDir sourceFile
1.2 示例
1.2.1 Java文件目錄結構
1.2.2 在 NativeCpp.java 文件所在目錄打開命令行
1.2.3 執行命令 javac -encoding utf8 -h . NativeCpp.java(注意 點 后面有個空格)
-encoding utf8 指定源文件編碼格式
-h . 頭文件的輸出目錄,. 表示當前目錄,后面必需加個空格
NativeCpp.java 源文件
1.2.4 結果
3. 生成的頭文件內容
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_streamax_s17_fms_business_jni_NativeCpp */ #ifndef _Included_com_streamax_s17_fms_business_jni_NativeCpp #define _Included_com_streamax_s17_fms_business_jni_NativeCpp #ifdef __cplusplus extern "C" { #endif /* * Class: com_streamax_s17_fms_business_jni_NativeCpp * Method: parseBlacBox * Signature: (Ljava/lang/String;II)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_streamax_s17_fms_business_jni_NativeCpp_parseBlacBox (JNIEnv *, jobject, jstring, jint, jint); #ifdef __cplusplus } #endif #endif
2. 使用 javah 生成 JNI 頭文件
2.1 基本使用方法
在包結構開始的目錄打開命令行窗口;
執行命令:javah -d targetDir -classpath . 包路徑+類名(類名不包含文件后綴名)
2.1.1 在包結構開始的目錄打開命令行窗口
在源代碼包結構開始處或者class文件包結構開始處都可以;
2.1.2 執行命令:javah -classpath . com.streamax.s17.fms.business.jni.NativeCpp
-classpath . 指定加載類的路徑,因為當前目錄是包結構開始的目錄,所以使用 . ,表示當前目錄;
com.streamax.s17.fms.business.jni.NativeCpp 本地方法所在的包路徑+類名(注意沒有.java或者.class的后綴);
2.1.3 結果
不指定輸出路徑,生成的頭文件默認在當前目錄下;
使用 -d targetDir 指定輸出路徑,
javah -d ../ -classpath . com.streamax.s17.fms.business.jni.NativeCpp 此處指定頭文件生成在當前目錄的父目錄
2.1.4 頭文件內容
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_streamax_s17_fms_business_jni_NativeCpp */ #ifndef _Included_com_streamax_s17_fms_business_jni_NativeCpp #define _Included_com_streamax_s17_fms_business_jni_NativeCpp #ifdef __cplusplus extern "C" { #endif /* * Class: com_streamax_s17_fms_business_jni_NativeCpp * Method: parseBlacBox * Signature: (Ljava/lang/String;II)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_streamax_s17_fms_business_jni_NativeCpp_parseBlacBox (JNIEnv *, jobject, jstring, jint, jint); #ifdef __cplusplus } #endif #endif