文档章节

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

牛牛张
 牛牛张
发布于 2015/04/30 14:54
字数 545
阅读 8
收藏 0

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

本文转载自:http://www.cnblogs.com/charley_yang/archive/2011/03/13/1983038.html

牛牛张
粉丝 8
博文 45
码字总数 10212
作品 0
海淀
高级程序员
私信 提问
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米_思聪
2014/09/16
0
0
cygwin + gcc+makeFile入门(三): JNI的编译

不想花大力气介绍JNI,所以这部分需要你自己去查阅入门资料: 1. 写包含Native方法的Java类 2. 编译上述java类,并通过javah生成.h头文件 3. 根据头文件写CPP 4. 编译.h + .cpp文件 首先学习一...

晨曦之光
2012/03/09
555
0
Java中JNI的使用详解第一篇:HelloWorld

今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内部输出“Hello World",然后再回到Java中进行调用。分为以下步...

zhangyujsj
2015/08/23
0
0
简单介绍Java和C/C++交互

1、Java调用C/C++: Java代码 [JNITest.java]: package darcy; public class JNITest { static{ System.loadLibrary("Hello"); } public native void HelloKitty(); public static void main(......

叶大侠
2014/03/18
0
0
JNI实现JAVA调用C/C++开源库

一、前言 JNI(Java Native Interface)的作用是实现java调用C/C++写的方法或开源库。由于java语言自身的局限性,一些特定功能的开源库往往是没有java语言版本的,比如本人项目中需要用到DSP库...

国之利刃2013
2017/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式

//分静态代理和动态代理,区别:是否再编译时知道被被代理的对象 //思想,被代理类将自己的处理交给代理类,代理类可以添加一些新的功能,之后有代理类和客户端交互 https://www.cnblogs.co...

南桥北木
14分钟前
0
0
Spring系列教程七: Spring 整合mybatis的四种方式

一、使用注解实现整合mybatis 项目目录如下 第一步、导入jar包 <build> <resources> <!-- mapper.xml文件在java目录下 --> <resource> ......

我叫小糖主
20分钟前
4
0
阿里P7架构师:这些技术点没搞懂,我劝你不要跳槽!

阿里P7架构师架构师:这些技术点没搞懂,我劝你不要跳槽! 哪些技术点呢? 废话不多说,技术点全在下面这6张图里面了! 1.怎么看源码? 2.分布式 3.微服务 4.性能优化 5.工程化 粉丝福利:一...

别打我会飞
38分钟前
3
0
易错题

父类必须有一个无参构造,不然会报Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor...

architect刘源源
43分钟前
1
0
使用Json4s 将带有Timestamp的对象转json时 变为所在时区

在有Timestamp属性的对象转json时 最后出来的时间会减小8小时,是因为变成了0时区,需要将隐式转换中添加设置本地时区 import org.json4s.{DefaultFormats, Formats}import org.json4s.jac...

可达鸭Go
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部