1. 程式人生 > >使用javah生成C/C++標頭檔案的誤區

使用javah生成C/C++標頭檔案的誤區

出處:http://www.cnblogs.com/charley_yang/archive/2011/03/13/1983038.html

使用Javah 可以獲取您的 Java 原始檔並生成 C/C++標頭檔案,其中包含您的 Java 程式碼中所有本地方法(native方法)的 JNI 存根(stub,C標頭檔案)。如果您正在生成一個類的 JNI 存根,而且您已經把這個類定義為包的一部分,那麼您 必須指定完全限定的類名。

下面舉例說明:

使用eclipse建立一個工程假設工程路徑為$ProjectPath,並且你已經定義了一個類,並且帶包名:cn.com.comit.jni

----------------------------

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 stub
new 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標頭檔案:

1 2 3 4 5 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class cn_com_comit_jni_HelloJni */ //避免重複包含標頭檔案
1 2 #ifndef _Included_cn_com_comit_jni_HelloJni #define _Included_cn_com_comit_jni_HelloJni
1 //c++編譯環境中才會定義__cplusplus (plus就是"+"的意思
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #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