native方法在java中介绍及使用图解

一、native()方法简单介绍。

  1. 概念:简单地讲,一个Native Method就是一个Java调用非java代码的接口(因为这个整个实现是用非JAVA语言来完成的),这个native方法不可以使用abstract 来修饰,因为这个方法不是抽象的,方法有实体,但是实体实现的语言不是JAVA而已。一个JAVA Native Method 可能是这样:该方法的实现由非java语言实现,比如C。当然,这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
  2. 为什么引入native方法?
    java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
    与java环境外交互:有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
    与操作系统交互:JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
  3. native方法的利弊与取舍
    看起来native方法会给我们程序效率带来提高,几乎没有什么毛病,实际不然,使用native方法会带来潜在的安全隐患,因为本机方法执行实际的机器代码,它有权使用主机系统的所有资源,本机执行代码不收java执行环境的限制,因此可能会导致病毒入侵。与此同时,因为使用本机方法,调用dll动态链接库,具体实现代码都是在dll文件中的,因为本机方法都是依赖于CPU和操作系统,因此dll文件在本质上,是不可移植的,从而丧失了程序的可移植性。因为这个缘故,一般都不常使用native方法,除非实在有必要,才选择使用native方法。这个是core java 书中看到的。

二、native()方法的实现

  1. 带有native方法的类。
public class Native_method_demo {  //类型可以自己任意取
  public native void h(String name);   // 声明为本地方法,其中这个方法不可以用abstract 来修饰。
	static {
		System.loadLibrary("Test");    // 导入动态链接库,就是导入Test.dll 文件
	}
public static void main(String[] args) {	
			new Native_method_demo().h("tangsir");		
}

2.进入Windows 终端, 使用 javac -h . Native_method_demo.java 命令进行编译生成头文件。点号,不可以省略,表示在当前目录生成头文件。 在这里插入图片描述结果生成在这里插入图片描述
3. 使用能编译C++语言的软件来新建一个dll(动态链接库)工程,然后编写源文件,生成dll文件。这里我使用了CodeBlocks软件。
在这里插入图片描述
在这里插入图片描述
4.给工程取一个名字,这个名字就是前面System.loadLibrary(“Test”);中的Test,名字要对应。首先右键点击 Test 工程,选中add file, 将之前生成的头文件导入Test工程中。
在这里插入图片描述
5.查看头文件信息。看到里面其中也导入了一个头文件 <jni.h> ,这个也需要导入工程里面,这个头文件在JDK里面。
在这里插入图片描述
导入<jni.h>文件,这个文件在你安装jdk 目录下的 include 文件下面。并修改为绝对路径。
在这里插入图片描述
在这里插入图片描述
6.打开jin.h 头文件,查看这个头文件是否导入了其他的头文件,这个头文件还j导入了 jni.md 文件。因此也需要把这个头文件也导入进Test 工程中。注意,这里的导入一定是绝对路径,如果不是,最好修改为绝对路径。
在这里插入图片描述
导入<jni_md.h>头文件
在这里插入图片描述
7.到此,需要编写源文件了。

#include "D:\JAVA_HOME\include\jni.h"  //头文件绝对路径
#include "F:\java_project\algorithm_analyse\src\cn\edu\tju\applet_learing\cn_edu_tju_applet_learing_Native_method_demo.h"
// a sample exported function

JNIEXPORT void JNICALL Java_cn_edu_tju_applet_1learing_Native_1method_1demo_h
  (JNIEnv * env, jobject o, jstring s){
 char * t;  //声明一个字符串指针。
 t=(char *)env->GetStringUTFChars(s,0); //C语言中是没有String 类型的,所以需要转换为UTF-8  char * 类型。不然有可能出现乱码。
 printf("%s",t);  //打印 
return; //结束
}

注意:所有的头文件最好都是用绝对路径,除非你在头文件放入C++语言软件的工程目录下。

  1. 编译生成dll文件。然后将dll文件移动到java的工程目录下。然后运行本地方法进行测试。
    在这里插入图片描述
    生成的dll文件
    在这里插入图片描述
    移动到 你自己的 java工程目录下。
    在这里插入图片描述
    进行运行测试,查看结果。
    在这里插入图片描述
    测试结果成功。

三、java中native()方法查看

1,进入Androidxref官网官网地址
2 .选择合适的SDK版本 进入下面这个界面。
在这里插入图片描述
如果本地方法使用了 static 修饰,直接使用方法名称来进行搜索就行。exp:
在这里插入图片描述
直接搜索registerNatives ,在右边选中select all。
在这里插入图片描述
如果native 没有使用static 方法,则需要进行 类名_方法名 进行搜索。exp:
在这里插入图片描述我们需要搜索 String_intern
在这里插入图片描述
查出的结果,你就可以看了.
以上内容均个人笔记,有问题欢迎交流。

  • 19
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值