,,详解Java中native方法的使用

,,详解Java中native方法的使用

和C联合开发的时候用的是Native!用native关键字说明这个方法是一个原生函数,即这个方法用C/C语言实现,编译成一个DLL,由java调用。本文介绍了java中native方法的使用。有兴趣的朋友来看看吧。

今天在网上学习的时候,碰到了原生修饰符修改的方法。网上查了一下,觉得录下来挺有意思的。

1、native简介

简单来说,原生方法就是java调用非java代码的接口。原生方法是一种java方法,它的实现是由非java语言(如c)实现的。许多其他编程语言都有这种机制。例如,在C++中,可以使用extern“C”来告诉c++编译器调用C函数。

和C联合开发的时候用的是Native!用native关键字说明这个方法是一个原生函数,即这个方法用C/C语言实现,编译成一个DLL,由java调用。这些函数的实现者在DLL中,JDK的源代码中不包含DLL。你应该看不到它们。对于不同的平台,它们也是不同的。这也是java的底层机制。事实上,java在不同的平台上调用不同的本机方法来访问操作系统。总而言之:

Native用于java与其他语言(如C)的协作,即native之后的函数实现不是用java写的。

既然都不是java,那就不用管它的源代码了。我们只需要知道这个方法已经实现了。

Native的意思是通知操作系统你必须为我实现这个功能,因为我要用。所以native关键字的功能都是操作系统实现的,java只能调用。

Java是一种跨平台的语言。既然是跨平台,付出的代价就是牺牲一些底层的控制权。但是,如果java想要控制底层,就需要其他语言的一些帮助。这就是native的作用。

2、native用法

1.用本机声明的方法编写java类(Java文件)。

2.使用javac命令编译Java类(类文件),如javac NativeTest.java

3.使用javah-JNI * * *生成头文件(的文件。h)带后缀。h,比如javah -jni NativeTest

4.使用其他语言(C,C)实现本地方法

5.从本地方法编写的文件生成动态链接库(dll文件)。

注意:JavaC NativeTest.java没有包名,因为我的NativeTest.java不在任何包中。

示例如下:

公共类NativeTest {

public native void hello(字符串名);

静态{

system . loadlibrary(' wittdong ');//wittdong与生成DLL的wittdong.dll同名。

}

公共静态void main(String[] args){

新的NativeTest()。hello(' JNI ');

}

}

打开javah编译一个带有后缀的文件图。h:

4.用C语言实现本地方法(hello),生成NativeTestImpl.c格式文件。

#包含jni.h

#包含“NativeTest.h”

#包含stdio.h

JNI export void JNI call Java _ native test _ hello(JNI env * env,jobject obj,jstring name){

printf(“hello world”);

}

5.生成动态链接库。

单向:CL-I % Java _ home % \ include-I % Java _ home % \ include \ Win32-LD nativetestimpl . c-Fe wittdong.dll

另一种方法:用VC 6.0编译,在debug文件夹中生成dll文件。

将dll放在第一级文件夹中。h,您可以进行本机本地方法调用。执行Eclipse时,需要将dll文件复制到C:\Windows\System32。

3、补充资料

之间的联系和区别。c和。C语言的h文件:

本质上没有区别。但是一般来说。h文件是一个头文件,包含函数声明、宏定义、结构定义等。

的。c文件是一个程序文件,里面包含函数、变量等等。而且是什么后缀也无所谓,但是编译器默认会对带有某些后缀的文件采取一些动作。您可以强制编译器将带有任何后缀的文件编译为C文件。

分别编写两个文件是一种很好的编程风格。

而且,比如我在aaa.h中定义了一个函数的声明,然后我在aaa.h的同一个目录下建立了aaa.c,在aaa.c中定义了这个函数的实现,然后#在。主函数所在的c文件。然后我就可以用这个功能了。Main会在运行时找到这个定义了这个函数的aaa.c文件。

这是因为:

主函数是标准C/C的程序入口,编译器会先找到函数所在的文件。

假设编译器编译myproj.c(包括main())并发现它包含mylib.h(其中声明了函数void test()),那么编译器会寻找同名的实现文件(扩展名。cpp或者。c,这里是mylib.c)(应该和java的导入一样)。如果找到这个文件,找到这个函数的实现代码(这里是void test()),继续编译;如果在指定的目录中找不到实现文件,或者在该文件和后续的包含文件中找不到实现代码,将返回编译错误。其实include的过程完全可以‘视为’一个文件拼接的过程。声明和实现分别写在头文件和C文件中,或者两者同时写在头文件中,理论上没有本质区别。

关于java中使用原生方法的详细解释,本文到此结束。关于在Java中使用本机方法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: