JAVA通过JNI调用本地C语言方法

来源:互联网 发布:百度云云视频软件 编辑:程序博客网 时间:2024/04/20 16:01
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

简单介绍及应用如下:



一、JAVA中所需要做的工作

在JAVA程序中,首先需要在类中声明所调用的库名称,如下:

static {

System.loadLibrary(“goodluck”);

}

在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。

还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:

public native static void set(int i);

public native static int get();

然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。



例如程序testdll.java,内容为:

public class testdll

{

static

{

System.loadLibrary("goodluck");

}



public native static int get();

public native static void set(int i);



public static void main(String[] args)

{

testdll test = new testdll();

test.set(10);

System.out.println(test.get());

}

}

用javac testdll.java编译它,会生成testdll.class。

再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。



二、C/C++中所需要做的工作

对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。



接上例子。我们先看一下testdll.h文件的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class testdll */



#ifndef _Included_testdll

#define _Included_testdll

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: testdll

* Method: get

* Signature: ()I

*/

JNIEXPORT jint JNICALL Java_testdll_get

(JNIEnv *, jclass);



/*

* Class: testdll

* Method: set

* Signature: (I)V

*/

JNIEXPORT void JNICALL Java_testdll_set

(JNIEnv *, jclass, jint);



#ifdef __cplusplus

}

#endif

#endif

在具体实现的时候,我们只关心两个函数原型

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);



JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

好,下面我们用testdll.cpp文件具体实现这两个函数:

#include "testdll.h"

int i = 0;

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)

{

return i;

}

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)

{

i = j;

}

编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll



把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人左肩的灯灭了怎么办 香港超过7天了怎么办? 手机拍完照图像是倒的怎么办 地下城金币邮寄卡了怎么办 wow7.3打团本卡怎么办 上古卷轴5出bug怎么办 苹果手机打游戏太卡怎么办 梦幻将军令换了怎么办 手机丢了将军令怎么办 大军之印放弃了怎么办 联想一体机进入界面就死机怎么办 nmd袜子鞋露脚趾怎么办 生意不顺意志崩溃了怎么办 笔记本突然卡住不动了怎么办 指定货代费用高怎么办 空运舱单上的收货人错了怎么办? 被诚信贷骗了怎么办 原户主不迁户口怎么办 二手房原房主没迁走怎么办 办退工没有就失业证怎么办 消防队教导员插手商场翘柜台怎么办 调动工作原单位领导不放人怎么办 脚碰了一下肿了怎么办 六十岁的犯人身体有病怎么办 比熊肛门周围发炎怎么办 夏天肛门周围皮肤发炎怎么办 直肠息肉手术后便秘怎么办 痔疮手术后肛门洞怎么办 痔手术后肛门有个洞怎么办 直肠上长了瘤怎么办 上嘴唇没有唇峰怎么办 拉屎厕所堵了怎么办啊 小孩一拉屎就哭怎么办 上火裆部有肿块特别疼怎么办 狗狗拉屎拉不出来怎么办 肛裂大便带血怎么办 辣椒不小心弄丁丁上怎么办 小鸡躺着不动还呼吸怎么办 老人身体不舒服不敢去检查怎么办 金毛上火鼻子干怎么办 狗鼻子干裂结壳怎么办