认识理解Java中native方法.doc_第1页
认识理解Java中native方法.doc_第2页
认识理解Java中native方法.doc_第3页
认识理解Java中native方法.doc_第4页
认识理解Java中native方法.doc_第5页
全文预览已结束

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java入门-认识理解Java中native方法 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C+慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同程序的接口,其实现步骤: 、在Java中声明native()方法,然后编译; 、用javah产生一个.h文件; 、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 、将第三步的.cpp文件编译成动态链接库文件; 、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。 JAVA本地方法适用的情况 1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问 2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的 3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。 首先写好JAVA文件 /* * Created on 2005-12-19 Author shaoqi */ package com.hode.hodeframework.modelupdate; public class CheckFile public native void displayHelloWorld(); static System.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的文件 然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件 #include CheckFile.h #include #include JNIEXPORT 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 -I%java_home%include -I%java_home%includewin32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll 最后在运行时加参数-Djava.library.path=dll存放的路径1.确保gcc编译器已安装2.编写HelloJNI.java代码,用native声明需要用C实现的函数。如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/Desktop/com/hhiiuxx/test/HelloJNI.java代码package com.hhiiuxx.test; public class HelloJNI static System.loadLibrary(goodluck); public native static int get(); public native static void set(int i); public static void main(String args) HelloJNI test = new HelloJNI(); test.set(10); System.out.println(test.get(); 3.在HelloJNI.java文件所在目录下编译.java文件。javac HelloJNI.java4.在/Desktop下编译第三步中生成的.class文件,生成对应的.h头文件,本例中生成的头文件名为com_hhiiuxx_test_HelloJNI.hjavah com.hhiiuxx.test.HelloJNI5.编写HelloJNI.c文件,实现引用第4步中生成的.h头文件,并实现其中声明的方法。代码#include com_hhiiuxx_test_HelloJNI.h int i = 0; JNIEXPORT jint JNICALL Java_com_hhiiuxx_test_HelloJNI_get(JNIEnv *env, jclass jc) return i; JNIEXPORT void JNICALL Java_com_hhiiuxx_test_HelloJNI_set(JNIEnv *env, jclass jc, jint j) i = j; 6.将第5步中编写的HelloJNI.c文件,编译成.o文件gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c HelloJNI.c注:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include 是jni.h头文件所在的路径/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux 是jni_md.h所在的路径7.将第6步中生成的HelloJNI.o文件编译成.so库文件gcc -shared HelloJNI.o -o libgoodluck.so注:和windows下不同,linux的库文件必须是以libxxx.so形式命令的(或者libxxx.so.y,y是版本号),lib前缀是为了系统能够识别它,xxx是java代码System.loadLibrary(xxx);中引用库的名字。8.将第7步中生成的libgoodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。前提是你有足够的权限,如果是像我一样,在公司没有sudo权限的同学,用下面的方法:1) 在/home下建立一个用来存放.so库文件的目录,比如/home/hhiiuxx/lib2) 把libgoodluck.so文件拷贝到该目录下3)打开Terminal,运行如下命令export LD_LIBRARY_PATH=/home/hhiiuxx/lib只在当前shall下有效.9.在运行HelloJNI.cla

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论