java高*之实现本地方法

时间:2022-05-30 17:20:42

java高*之实现本地方法

什么是本地方法?

java中使用native修饰的方法就是本地方法。比如Thread类中的这个方法:

public static native Thread currentThread();

一个Native Method就是一个java调用非java代码的接口,一般都是由C/C++实现。

为什么要使用本地方法?

java使用起来非常方便,然而有些层次的任务用java实现起来不容易,

或者我们对程序的效率很在意时,就需要用到本地方法。

JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,

它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎

样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。

这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,

甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。

自定义实现本地方法

代码如下:

public class MyNative {
    static {
        System.loadLibrary("MyNative");
    }



    public void showParms(String s, int i, boolean b) {
        showParms0(s, i, b);
    }

    private native void showParms0(String s, int i, boolean b);


    public static void main(String[] args) {
        new MyNative().showParms("aaa",111,true);
    }


}

通过javac MyNative.java 编译java文件

然后通过javah -jni MyNative命令生成MyNative.h文件。内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyNative */

#ifndef _Included_MyNative
#define _Included_MyNative
#ifdef __cplusplus
extern "C" {
#endif
/* * Class: MyNative * Method: showParms0 * Signature: (Ljava/lang/String;IZ)V */
JNIEXPORT void JNICALL Java_MyNative_showParms0
  (JNIEnv *, jobject, jstring, jint, jboolean);

#ifdef __cplusplus
}
#endif
#endif

然后手动编写MyNative.c文件,内容如下:

#include <stdio.h>
#include "MyNative.h"
JNIEXPORT void JNICALL Java_MyNative_showParms0
  (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b)
{
  const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );
  printf( "String = [%s]\n", szStr );
  printf( "int = %d\n", i );
  printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );
  (*env)->ReleaseStringUTFChars( env, s, szStr );
}

然后执行命令:cl -I D:/java/jdk1.8.0/include -I D:/java/jdk1.8.0/include/win32 -LD MyNative.c -FeMyNative.dll,

需要安装Visual C++ ,并且设置好环境变量后,才可以执行此命令。如果环境不对引起的错误,常见的就是一些*.dll文件找不到的错误,

你可以在visual C++或者jdk目录下搜索,搜到后考到指定目录就可以了。

D:\>cl -I D:/java/jdk1.8.0/include -I D:/java/jdk1.8.0/include/win32 -LD MyNative.c -FeMyNative.dll
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.30319.01 版
版权所有(C) Microsoft Corporation。保留所有权利。

MyNative.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/dll
/implib:MyNative.lib
/out:MyNative.dll
MyNative.obj
   正在创建库 MyNative.lib 和对象 MyNative.exp
LIBCMT.lib(crt0init.obj) : warning LNK4254: 节“.CRT”(40000040)合并到具有不同特性的“.data”(C0000040)

就会生成几个文件,其中有我们需要的MyNative.dll文件,其他不要的文件可以删除。

最后使用:java MyNative 命令运行此class文件,就会看到运行结果:

D:\>java MyNative
String = [aaa]
int = 111
boolean = true