https://blog.csdn.net/sunp823/article/details/45302103
"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++实现。
编译:javac Native_Method.java,此时将生成Native_Method.class;
javah -jni Native_Method,此时将生成一个Native_Method.h文件。具体如下:
编写Native_Method.cpp文件:
在DEV C++下新建一个DLL动态链接工程,取名test,将上述.cpp和.h文件加入到工程中,编译,此时会报错:找不到
C:\Program Files\Java\jdk1.6.0_31\include\win32
编译这个工程,此时将出现test.dll文件。
运行这个Java文件:java Native_Method -Djava.library.path=test.dll;(此处.dll文件和Java文件在同一路径下)。
出现结果8.
前言
因为项目需要使用到Java Native Methods,看了《Core Java™ Volume II–Advanced Features, Eighth Edition》12章第1节,按着书中的例子完成了一个简单的例子。
现将过程及结果记录下来,供以后参考。
以下代码是书中的代码。
环境
centos 5.8 x86_64
jdk6 x86_64
eclipse 3.7 x86_64
gcc x86_64
内容
1 新建HelloNative.java文件(默认包,以下同),请注意native关键字
/**
* @version 1.11 2007-10-26
* @author Cay Horstmann
*/
class HelloNative
{
public static native void greeting();
}
2 编译HelloNative.java文件
javac HelloNative.java
3 生成C头文件
javah HelloNative
生成的文件如下:
HelloNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
4 编写C文件
HelloNative.c
/*
@version 1.10 1997-07-01
@author Cay Horstmann
*/
#include "HelloNative.h"
#include
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl)
{
printf("Hello Native World!\n");
}
5 编译C文件
gcc -fPIC -I $JAVA_HOME/include -I$JAVA_HOME/include/linux -shared -o libHelloNative.so HelloNative.c
6 编写测试Java类
HelloNativeTest.java
/**
* @version 1.11 2007-10-26
* @author Cay Horstmann
*/
class HelloNativeTest
{
public static void main(String[] args)
{
HelloNative.greeting();
}
static
{
System.loadLibrary("HelloNative");
}
}
7 编译Java测试类
javac HelloNativeTest.java
8 运行测试
java -Djava.library.path=. HelloNativeTest