使用Javah 可以擷取您的 Java 源檔案並產生 C/C++標頭檔,其中包含您的 Java 代碼中所有本地方法(native方法)的 JNI 存根(stub,C標頭檔)。如果您正在產生一個類的 JNI 存根,而且您已經把這個類定義為包的一部分,那麼您 必須指定完整類名。
下面舉例說明:
使用eclipse建立一個工程假設工程路徑為$ProjectPath,並且你已經定義了一個類,並且帶包名:cn.com.comit.jni
----------------------------
package cn.com.comit.jni;public class HelloJni {public native void displayHelloJni();static{System.loadLibrary("");}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubnew HelloJni().displayHelloJni();}}
----------------------------
eclipse會自動幫你編譯出一個位元組碼檔案HelloJni.class,路徑是$ProjectPath\bin\cn\com\comit\jni,很可能你會先cd到.class的目錄這麼做:
>cd $ProjectPath\bin\cn\com\comit\jni
>$ProjectPath\bin javah HelloJni
發現執行出錯:
錯誤:無法訪問 HelloJni
錯誤的類檔案: .\HelloJni.class
類檔案包含錯誤的類: cn.com.comit.jni.HelloJni
請刪除該檔案或確保該檔案位於正確的類路徑子目錄中。
看來是路徑有問題咯。那改成
javah cn.com.comit.jni.HelloJni
再次運行,發現還是錯誤:
錯誤:無法訪問 cn.com.comit.jni.HelloJni
未找到 cn.com.comit.jni.HelloJni 的類檔案
javadoc: 錯誤 - 找不到類 cn.com.comit.jni.HelloJni。
怎麼才能解決這個問題呢?其實只要cd到包的上一級目錄(我們這裡是$ProjectPath\bin)在運行下面的命令就搞定了:
javah -classpath . cn.com.comit.jni.HelloJni
看一下產生的C標頭檔:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class cn_com_comit_jni_HelloJni *///避免重複包含標頭檔
#ifndef _Included_cn_com_comit_jni_HelloJni #define _Included_cn_com_comit_jni_HelloJni
//c++編譯環境中才會定義__cplusplus (plus就是"+"的意思
#ifdef __cplusplus extern "C" { //告訴編譯器下面的函數是c語言函數(因為c++和c語言對函數的編譯轉換不一樣,主要是c++中存在重載)#endif/* * Class: cn_com_comit_jni_HelloJni * Method: displayHelloJni * Signature: ()V */JNIEXPORT void JNICALL Java_cn_com_comit_jni_HelloJni_displayHelloJni (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif