Java中native方法和JNI基础.docx

上传人:自*** 文档编号:126228662 上传时间:2020-03-23 格式:DOCX 页数:7 大小:45.06KB
返回 下载 相关 举报
Java中native方法和JNI基础.docx_第1页
第1页 / 共7页
Java中native方法和JNI基础.docx_第2页
第2页 / 共7页
Java中native方法和JNI基础.docx_第3页
第3页 / 共7页
Java中native方法和JNI基础.docx_第4页
第4页 / 共7页
Java中native方法和JNI基础.docx_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Java中native方法和JNI基础.docx》由会员分享,可在线阅读,更多相关《Java中native方法和JNI基础.docx(7页珍藏版)》请在金锄头文库上搜索。

1、Java中native方法和JNI基础Java不是完美的,Java的不足除了体现在运行速度上要比传统的C+慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。可以将native方法比作Java程序同程序的接口,其实现步骤:、在Java中声明native()方法,然后编译;、用javah产生一个.h文件;、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);、将第三步的.cpp文件编译成动态链接库文件;、在Java中用System.loadLibrary()

2、方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。JAVA本地方法适用的情况1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。首先写好JAVA文件/* Created on 2005-12-19 Author shaoqi*/package com.hode.hodeframework.modelupdate;public class CheckFilepublic native vo

3、id displayHelloWorld();staticSystem.loadLibrary(test);public static void main(String args) new CheckFile().displayHelloWorld();然后根据写好的文件编译成CLASS文件然后在classes或bin之类的class根目录下执行javah -jni com.hode.hodeframework.modelupdate.CheckFile,就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件然后根据头文件的内容

4、编写com_hode_hodeframework_modelupdate_CheckFile.c文件#include CheckFile.h#include#includeJNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj)printf(Hello world!n);return;之后编译生成DLL文件如“test.dll”,名称与System.loadLibrary(test)中的名称一致 vc的编译方法:cl -

5、I%java_home%include -I%java_home%includewin32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll最后在运行时加参数-Djava.library.path=dll存放的路径JNI入门: 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。 Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能

6、。通常有以下几种情况我们需要使用JNI来实现。 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们 在java核心技术中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了JNI你 的程序就会丧失可移植性。在本文我们跳过JNI的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂。关系如下图所示: 下面我们开始编写HelloWorld程序,由

7、于涉及到要编写c/c+代码因此我们会在开发中使用Microsoft VC+工具。1. 编写java代码我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示class HelloWorld public native void displayHelloWorld(); static System.loadLibrary(hello); public static void main(String args) new HelloWorld().displayHelloWorld(); 注 意我们

8、的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因 为我们要用c/c+语言实现它。注意System.loadLibrary(hello)这句代码,它是在静态初始化块中定义的,系统用来装载 hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)2. 编译java代码javac HelloWorld.java 生成HelloWorld.class文件3. 创建.h文件这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c+代码中用

9、到,我们运行javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下在此我们不对他进行太多的解释。/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef _cplusplusextern C #endif/* Class: HelloWorld* Method: displayHe

10、lloWorld* Signature: ()V*/JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);#ifdef _cplusplus#endif#endif4. 编写本地实现代码在这部分我们要用C/C+语言实现java中定义的方法,我们在VC+中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下#include #include HelloWorld.h#include JNIEXPORT void JNICALLJava_HelloWorld_disp

11、layHelloWorld(JNIEnv *env, jobject obj) printf(Hello world!n); return;注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC+里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。5. 运行java程序把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|的输出了。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号