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