您的位置:首页 > 编程语言 > C语言/C++

使用Javah 生成C/C++头文件的误区

2015-04-30 00:00 459 查看
摘要:使用Javah生成C/C++头文件的误区

使用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(
""
);


}


/**


*@paramargs


*/


public

static

void

main(String[]args){


//TODOAuto-generatedmethodstub


new

HelloJni().displayHelloJni();


}

}

----------------------------
eclipse会自动帮你编译出一个字节码文件HelloJni.class,路径是$ProjectPath\bin\cn\com\comit\jni,很可能你会先cd到.class的目录这么做:
>cd$ProjectPath\bin\cn\com\comit\jni
>$ProjectPath\binjavahHelloJni
发现执行出错:
错误:无法访问HelloJni
错误的类文件:.\HelloJni.class
类文件包含错误的类:cn.com.comit.jni.HelloJni
请删除该文件或确保该文件位于正确的类路径子目录中。
看来是路径有问题咯。那改成
javahcn.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
/*DONOTEDITTHISFILE-itismachinegenerated*/

#include<jni.h>

/*Headerforclasscn_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

JNICALLJava_cn_com_comit_jni_HelloJni_displayHelloJni


(JNIEnv*,jobject);

#ifdef__cplusplus

}

#endif

#endif

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: