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

来源:互联网 发布:淘宝14年老店有哪些 编辑:程序博客网 时间:2024/04/26 11:33
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 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 /* Header for class testdll */ #ifndef _Included_testdll#define _Included_testdll#ifdef __cplusplusextern "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运行它,就可以观察到结果了。
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 桃花源记推广码 桃姐原型 桃园百家 桃园百家加点 桃园仓库在哪 桃园鬼谷妖道 桃园替天行道 陶晶莹姐妹淘心话 陶老师 黄尚武 陶荔芳 陶荔芳 南航 陶荔芳照片 陶玉春简历 陶喆母亲护子 陶喆女友乔安娜 淘八折返利网 淘宝规则的违规积分如何清零 淘大象和客户达哪个准 淘鸽网 淘金农场论坛 淘客家园 淘拍刷 淘信客信誉查询 讨厌雏森桃 套套堂视频 特技先发制人 特朗普访华概念股 特朗普再喷朝鲜 特蕾莎梅仓皇撤离曝光 特罗凯13552304516代 特猫肉系是什么意思 特猫肉系肖老板 特异功能猩求人粤语 特战奇侠 特种兵征婚 腾龙擎天棍 腾讯爱玩注册宝匣 腾讯房产本溪站 腾讯名人坊陈晓 腾讯视频aso优化数据分析报告 藤井莉娜壁纸