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