使用Javah 生成C/C++頭文件的誤區

    使用Javah 能夠獲取您的 Java 源文件並生成 C/C++頭文件,其中包含您的 Java 代碼中全部本地方法(native方法)的 JNI 存根(stub,C頭文件)。若是您正在生成一個類的 JNI 存根,並且您已經把這個類定義爲包的一部分,那麼您 必須指定徹底限定的類名。java

下面舉例說明:c++

使用eclipse創建一個工程假設工程路徑爲$ProjectPath,而且你已經定義了一個類,而且帶包名:cn.com.comit.jniweb

----------------------------eclipse

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的目錄這麼作:spa

>cd $ProjectPath\bin\cn\com\comit\jni.net

>$ProjectPath\bin javah HelloJnicode

發現執行出錯:orm

錯誤:沒法訪問 HelloJni
錯誤的類文件: .\HelloJni.class
類文件包含錯誤的類: cn.com.comit.jni.HelloJni
請刪除該文件或確保該文件位於正確的類路徑子目錄中。ip

看來是路徑有問題咯。那改爲

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
相關文章
相關標籤/搜索