java本地方法怎么实现_java高分局之实现本地方法

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

/* 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 voidJNICALLJava_MyNative_showParms0

(JNIEnv *, jobject, jstring, jint, jboolean);

#ifdef __cplusplus

}

#endif

#endif

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

#include

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值