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