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

来源:互联网 发布:淘宝我的舞台 编辑:程序博客网 时间:2024/04/26 18:49
<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博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 正宗海鲜大咖做法 美剧大玩咖 百变大咖秀为什么停播 遇见大咖第二季 百变大咖秀第三季 海鲜大咖怎么做 大咖说 大咖一日行 大伽和大咖区别 西安房哥行家大咖 家常多种海鲜大咖做法 向往生活之综艺大咖 法鲨大咚gif图 胸咚 咚巴拉 小通币咚 咚巴拉原唱 桂林dj咚鼓中文打碟 咚鼓dj网 咚鼓 咚小姐 咚锵拼音 咚太郎作品 小通币咚利息高得吓人 咚锵的拼音 dj330舞曲咚鼓dj网 djt8咚鼓 叮咯咙咚呛 dj听吧舞曲咚鼓dj330舞曲网 我大哥大 大哥大 大唐好大哥 大哥 大哥priest 帮大哥 大哥大哥欢迎你 大哥的硬糖 祝大哥 祝大哥歌词 大哥影院