使用Javah 產生C/C++標頭檔的誤區

來源:互聯網
上載者:User

      使用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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.