博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java native method
阅读量:4874 次
发布时间:2019-06-11

本文共 2457 字,大约阅读时间需要 8 分钟。

最近在看《深入理解Java虚拟机》,看了没几页,看到了一个以前不了解的概念:native方法。学习如下:

"A native method is a Java method whose implementation is provided by non-java code." native方法即本地方法,native方法的实现是非Java的,例如这个方法是用C/C++实现的。在Java文件中一个native方法不能有方法体,只有方法签名,类似于接口中的抽象方法,但是native关键字和abstract关键字不能同时修饰一个方法。因为如果abstract修饰的方法是要用Java语言实现的,只不过要在子类中实现,但是native方法是用非Java语言实现的,所以native和abstract是矛盾的。但是native可以和其他修饰符一起修饰方法,例如static、synchronized等。
native可以有返回值,可以返回任意Java类型,包括非基本类型,例如数组或Object类型。
如果native修饰一个方法,那么含有这个方法的类的子类可以继承这个本地方法并且可以用Java语言来重写。如果native和final一起修饰这个方法,则不可以重写,这和普通的方法相同。
众所周知Java是跨平台的,但是Java的native机制扩充了JVM,Java无法直接访问到操作系统底层(如硬件),但是C/C++在这方面具有优势,所以native方法可以在以下条件下使用:
 1.使用底层的主机平台(例如直接和访问操作系统或硬件)的某个特性,而这个特性不能通过JAVA API访问
 2.加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
实现步骤:
 1、编写Java程序,javac编译生成.class文件;
 1、用javah编译生成的class文件,产生.h头文件;
 2、编写.cpp文件实现native方法,其中需要包含上述.h头文件(.h文件中又包含了JDK自带的jni.h文件);
 3、将.cpp文件变异成动态链接库.dll文件;
 4、在Java中调用System.loadLibrary()方法或Runtime的loafLibrary()方法加载动态链接库文件,就可以在Java中调用这个native()方法,
 5、运行Java文件,运行时加参数-Djava.library.path=[dll存放的路径]。
下面是一个实例:编写一个计算两个整数和的本地方法,该本地方法使用C/C++实现。

public class Native_Method {	/**	 * @param args	 */	native public int cal(int a,int b);//本地方法无方法体	static 	{		System.loadLibrary("test"); 	}	public static void main(String[] args) {		// TODO Auto-generated method stub		Native_Method nm = new Native_method();		System.out.println(nm.cal(3,5));	}}

编译:javac Native_Method.java,此时将生成Native_Method.class;

            javah -jni Native_Method,此时将生成一个Native_Method.h文件。具体如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include 
/* Header for class Native_method */#ifndef _Included_Native_method#define _Included_Native_method#ifdef __cplusplusextern "C" {#endif/* * Class: Native_method * Method: cal * Signature: (II)I */JNIEXPORT jint JNICALL Java_Native_1method_cal (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif

编写Native_Method.cpp文件:

#include "Native_method.h"JNIEXPORT jint JNICALL Java_Native_1method_cal(JNIEnv *jnienv, jobject o, jint a, jint b)//实现这个方法 {                 return a+b;  }

在DEV C++下新建一个DLL动态链接工程,取名test,将上述.cpp和.h文件加入到工程中,编译,此时会报错:找不到<jni.h>头文件,这是需要将jdk下的include文件夹包含到工程中,具体做法:右击工程,工程属性,目录/文件,包含目录文件,将jdk安装路径下的include文件夹和include文件夹下的win32文件夹加入:C:\ProgramFiles\Java\jdk1.6.0_31\include

C:\Program Files\Java\jdk1.6.0_31\include\win32

编译这个工程,此时将出现test.dll文件。

运行这个Java文件:java Native_Method -Djava.library.path=test.dll;(此处.dll文件和Java文件在同一路径下)。

出现结果8.

 

 

转载于:https://www.cnblogs.com/sunp823/p/5601439.html

你可能感兴趣的文章
Android安全-代码安全1-ProGuard混淆处理
查看>>
部署core
查看>>
mysql 时间设置
查看>>
如何在 Xcode 中修改应用的名字
查看>>
[BZOJ5334][TJOI2018]数学计算(exgcd/线段树)
查看>>
[BZOJ4340][BJOI2015]隐身术(后缀数组)
查看>>
有关交换机——熟悉原理是必须的【转载】
查看>>
ACM(数学问题)——UVa202:输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。...
查看>>
【转】Android 读取doc文件
查看>>
P2602 [ZJOI2010]数字计数 (数位dp or 思维)
查看>>
C# 访问 C DLL
查看>>
Matlab与方程组
查看>>
NYOJ 477
查看>>
华为、科达、海康、大华等厂家摄像头通过非标方式(RTSP)接入流媒体服务实现WEB直播与录像...
查看>>
OSPF笔记
查看>>
PHP之abstract
查看>>
Rappid 消除试用版的弹出框
查看>>
精华 ionic入门之色彩、图标、边距和界面组件:列表
查看>>
顺变者昌
查看>>
Linux上vi(vim)编辑器使用教程
查看>>