在非常多情况下,java须要调用其它语言的代码,比方c的代码。那么这个时候java中native方法就发挥作用了。以下就介绍native方法的使用。

一、JNI使用流程

a.编写带有native声明的方法的Java类

b.使用javac命令编译编写的Java类

c.使用java -jni ****来生成后缀名为.h的头文件

d.使用其它语言(C、C++)实现本地方法

e.将本地方法编写的文件生成动态链接库

二、实践

1、编写类代码

package com.sunny.demo;

public class Demo01 {
public native void hello();//没有实现 static{
System.loadLibrary("hello");//在类载入的 时候载入dll
} public static void main(String[] args){ new Demo01().hello();
} }

2、编译

javac com/sunny/demo/Demo01.java(注意,我这里是带包编译)

3、生成.h文件

javah -jni com.sunny.demo.Demo01(注意。头文件生成文件夹的位置。不知.java文件的位置,而在和包同级文件夹中,这里生成的文件名称为com_sunny_demo_Demo01.h)

4、用c实现hello方法(vc++6.0新建dllproject)

(1)当中com_sunny_demo_Demo01.h中代码例如以下(javah自己主动生成的)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_sunny_demo_Demo01 */ #ifndef _Included_com_sunny_demo_Demo01
#define _Included_com_sunny_demo_Demo01
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_sunny_demo_Demo01
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_sunny_demo_Demo01_hello
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

(2).c文件,实现hello方法

#include<stdio.h>
#include"hello.h"
JNIEXPORT void JNICALL Java_com_sunny_demo_Demo01_hello(JNIEnv * a, jobject b){
printf("hello world");
}

(3)用VC++6.0编译一下在debug文件夹中就生成好了dll文件。

说明:编译时假设产生例如以下错误:fatal error C1083: Cannot open include file: 'jni.h': No such file or directory。说明没有找到jni.h。到jdk的安装文件夹 include/jni.h;win32/jni_md.h;win32/jawt_md.h这3个文件复制到vc的安装文件夹include中

5.将dll放到生成.h的那一集文件夹中。执行java com.sunny.demo.Demo01就会出现例如以下结果

三、总结:

上面的样例中,我是带包编译的,所以文件存放和生成的位置一定要注意,在java层面我们仅仅须要dll文件,.h和.cd 文件的目的仅仅是为了生成dll文件.最后给出我代码的文件夹结果

.h文件是javah生成的,dll文件是应该放的位置(假设不放在这个位置。执行报错,找不到hello这个库)

dll參考文章:http://www.cnblogs.com/chio/archive/2007/11/03/948480.html

external c :http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html

java native文章: http://blog.163.com/yueyemaitian@126/blog/static/21475796200701491621267




最新文章

  1. jquery 追加元素的方法
  2. System.load(PWConnector.dll)加载异常 Can&#39;t find dependent libraries
  3. 下载老版本的Xcode
  4. linux内核分析 课程总结
  5. 用re-sign.jar重签名apk后安装失败的解决办法
  6. 选数 2002年NOIP全国联赛普及组
  7. css中同时用头部引入和外部引入对同一个标签进行样式设置,哪一个优先级高。
  8. Python番外 事务 那些事
  9. [Javascript]3. Improve you speed! Performance Tips
  10. Linux常用解压文件
  11. C++中为什么构造函数初始化列表
  12. laytpl--前端数据绑定
  13. 深入学习JS执行--单线程的JS
  14. 正则表达式,提取html标签的属性值
  15. springboot 使用 redis
  16. JS基础之传参(值传递、对象传递)
  17. Windows 的命令行安装Scoop程序管理工具
  18. ansible笔记(9):常用模块之包管理模块
  19. Mybaties 实现批量修改
  20. 运维工具Ansible安装部署

热门文章

  1. CSS技巧----DIV+CSS规范命名大全集合
  2. vue elementui 递归 sidebar可伸缩侧边栏
  3. gdb 查看变量~p长串末尾省略号, 一个页面显示不完
  4. centos 安装squid http代理
  5. DNS 资源记录解释
  6. 华为上机测试题(大数相乘-java)
  7. Python 如何调用 Java
  8. cpp调用dll
  9. Redis设置记录
  10. (转)MYSQL 的 WITH ROLLUP