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

原文出处:http://www.cnblogs.com/charley_yang/archive/2011/03/13/1983038.html


使用java 执行某个类也有相似的问题!可以先cd 到class文件包名的根所在的文件夹 再java package_name.class_name 


   使用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
微软企业开发技术 | 移动开发(Google Android、Windows Mobile)技术| 嵌入式系统设计与开发 | JAVA开发
分类:  Java JNI
0
0
(请您对文章做出评价)
« 博主前一篇: Java JNI 进阶
» 博主后一篇: C++项目中的extern "C" {}

Feedback

#1楼   

2011-10-07 23:02 by  feiyunruyue   
谢谢楼主,我的解决了

#2楼   

2011-11-02 15:24 by  freedragon   
javah -classpath . com.ura.test.JNItestActivity

在项目bin目录下执行,javah -classpath . 包.class文件名

解决了实际问题,真好,O(∩_∩)O谢谢。

#3楼   

2012-05-28 13:43 by  lugesot   
谢谢lz,我也搞了很久才搞定。
再总结下。
1 是在包的上一层运行,不是bin的下面。例如,我开发android,包打在bin\classes下,那么你就要在classes下javah;”classes”为什么多出来,我也不知道。
2 class名前的“ . "非常重要,它应该代表当前路径查询。注意,它和”cn.com.comit.jni.HelloJni“之间有空格。

#4楼   

2012-07-25 15:26 by  刘博平   
绝大多数人都没提到这点,问题困扰了我很久
shit! Java!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值