native method jvm

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++实现。

[java]  view plain  copy
  1. public class Native_Method {  
  2.     /** 
  3.      * @param args 
  4.      */  
  5.     native public int cal(int a,int b);//本地方法无方法体  
  6.     static   
  7.     {  
  8.         System.loadLibrary("test");   
  9.     }  
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.         Native_Method nm = new Native_method();  
  13.         System.out.println(nm.cal(3,5));  
  14.   
  15.     }  
  16. }  

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

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

[cpp]  view plain  copy
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class Native_method */  
  4.   
  5. #ifndef _Included_Native_method  
  6. #define _Included_Native_method  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     Native_method 
  12.  * Method:    cal 
  13.  * Signature: (II)I 
  14.  */  
  15. JNIEXPORT jint JNICALL Java_Native_1method_cal  
  16.   (JNIEnv *, jobject, jint, jint);  
  17.   
  18. #ifdef __cplusplus  
  19. }  
  20. #endif  
  21. #endif  

编写Native_Method.cpp文件:

[cpp]  view plain  copy
  1. #include "Native_method.h"  
  2.   
  3. JNIEXPORT jint JNICALL Java_Native_1method_cal  
  4. (JNIEnv *jnienv, jobject o, jint a, jint b)//实现这个方法   
  5.   
  6. {  
  7.                  return a+b;    
  8. }  

在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.


前言

因为项目需要使用到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 <jni.h>
/* 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 <stdio.h>

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值