在java中透过JNI调用本地方法

在java中通过JNI调用本地方法
在java中通过JNI调用本地方法

只使用java语言显然不能满足所有的应用场景,例如要调用操作系统的一些资源、访问硬

件设备等,java就显得捉襟见肘,但是java在这方面也提供JNI(Java Native Interface)机制来适应这种要求。

如何使用JNI呢?
第一步:编写带有native声明的方法的java类
第二步:使用javac命令编译所编写的java类
第三步:使用javah命令生成扩展名为h的头文件
第四步:使用c/c++实现本地方法
第五步:将c/c++编写的文件生成动态连接库

(1)编写java类
代码如下:
public class tempdll{

static {
//加载动态库,这里的Hello表示的是动态连接文件的名称
                     //动态连接文件可以是dll文件(windows)或者so文件(liunx)
System.loadLibrary("Hello");
}
//声明本地方法
public native static int sayHello();

public static void main( String[] args ){
tempdll temp = new tempdll();
//调用本地的方法
System.out.println(temp.sayHello());
}
}
(2)编译tempdll类
在命令行中使用javac工具编译tempdll类文件,如下
javac tempdll.java (一定要配置好jdk的环境变量)
(3)生成.h的头文件
在命令行中使用javah工具生成.h的头文件,如下
javah tempdll
生成的内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class tempdll */

#ifndef _Included_tempdll
#define

_Included_tempdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     tempdll
* Method:    sayHello
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_tempdll_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

一些说明
JNIEXPORT:是关键字,表示此函数是要被JNI调用的
jint:返回类型
函数的名称是JAVA_再加上java程序的package路径再加函数名组成的


第四步:使用c/c++实现本地方法
这里选择使用c语言实现本地方法,建立tempdll.cpp的文件,内容如下
#include "tempdll.h"
int i = 100;
JNIEXPORT jint JNICALL Java_tempdll_sayHello(JNIEnv *, jclass){
return i;
}

第五步:生成动态连接库文件
这一步就是将tempdll.h 文件和tempdll.cpp文件生成动态连接库文件
当然你可以使用相应的工具在命令行中做这个事情。
我选择使用VC环境来做,怎么做呢?
需要在VC中建立动态连接工程,此工程的名字必须是“Hello”,然后

将tempdll.h和tempdll.cpp文件拷贝到目录工程中,然后将文件导
入工程中,编译后就可以生成Hello.dll文件。

将Hello.dll文件拷贝到和tempdll.class文件的相同目录中
在命令行中使用java tempdll 搞定。