java native方法使用

java native方法使用一 前言 nbsp nbsp nbsp nbsp nbsp 今天在看 java lang System 源码的时候看到了 System 静态代码块中有一个 registerNati 方法 该方法是被 native 关键字修饰 publicfinalc nbsp nbsp registerthen nbsp nbsp nbsp nbsp nbsp nbsp VMwillinvo

一、前言

          今天在看java.lang.System源码的时候看到了System静态代码块中有一个registerNatives方法,该方法是被 native关键字修饰。

    }………….

}

二、native用法

         简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C”告知C++编译器去调用一个C的函数。       

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

  1. native 是用做java 和其他语言(如c++)进行协作时使用的,也就是native 后的函数的实现不是用java写的。
  2.  既然都不是java,那就别管它的源代码了,我们只需要知道这个方法已经被实现即可。
  3. native的意思就是通知操作系统, 这个函数你必须给我实现,因为我要使用。 所以native关键字的函数都是操作系统实现的, java只能调用。
  4. java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了

三、native用法

1.编写带有native声明的方法的Java类(java文件)
2.使用javac命令编译编写的Java类(class文件)如:javac NativeTest.java
3.使用javah -jni 来生成后缀名为.h的头文件(.h的文件) 如:javah -jni NativeTest
4.使用其他语言(C、C++)实现本地方法
5.将本地方法编写的文件生成动态链接库(dll文件)




注意:javac NativeTest.java 没有带包名,因为我的NativeTest.java不在任何包(package)中。

示例如下:

1-3、

public class NativeTest {

    public native void hello(String name);
    static{

        System.loadLibrary(“


wittdong“);//wittdong和生成动态链接库的  wittdong.dll名字一致
    }
    public static void main(String[] args){

        new NativeTest().hello(“jni”);
    }
}





java native方法使用


java native方法使用

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

#include


#include “NativeTest.h”
#include


JNIEXPORT void JNICALL Java_NativeTest_hello(JNIEnv *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的那一级文件夹中,就可以进行native本地方法调用。在Eclipse执行时,需把dll文件拷贝到C:\Windows\System32

四、补充资料

c语言中.c和.h文件关系以及区别:

  本质上没有任何区别。 只不过一般:.h文件是头文件,内含函数声明、宏定义、结构体定义等内容

  .c文件是程序文件,内含函数实现,变量定义等内容。而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。你可以强制编译器把任何后缀的文件都当作c文件来编。

  这样分开写成两个文件是一个良好的编程风格。

  而且,比方说 我在aaa.h里定义了一个函数的声明,然后我在aaa.h的同一个目录下建立aaa.c ,aaa.c里定义了这个函数的实现,然后是在main函数所在.c文件里#include这个aaa.h 然后我就可以使用这个函数了。 main在运行时就会找到这个定义了这个函数的aaa.c文件。

  这是因为:

  main函数为标准C/C++的程序入口,编译器会先找到该函数所在的文件

  假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数void test()),那么此时编译器将按照事先设定的路径(Include路径列表及代码文件所在的路径)查找与之同名的实现文件(扩展名为.cpp或.c,此例中为mylib.c)(应该是跟java的import一样),如果找到该文件,并在其中找到该函数(此例中为void test())的实现代码,则继续编译;如果在指定目录找不到实现文件,或者在该文件及后续的各include文件中未找到实现代码,则返回一个编译错误.其实include的过程完全可以”看成”是一个文件拼接的过程,将声明和实现分别写在头文件及C文件中,或者将二者同时写在头文件中,理论上没有本质的区别。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201537.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:10
下一篇 2026年3月20日 上午9:11


相关推荐

  • Git面试题

    Git面试题1 强制推送 gitpushforce 克隆远程代码 gitcloneurl3 查看提交日志 gitlog4 拉取远程代码自动合并到当前分支 超级好用的命令 gitpullorigi 分支名 5 查看分支本地分支 gitbranch6 查看远程分支 gitbranch a7 本地新建分支 agitbranch 分支 a8 将当前分支切换到分支 agitcheckout 分支 a

    2026年3月19日
    3
  • 基于Lucene3.5.0怎样从TokenStream获得Token

    基于Lucene3.5.0怎样从TokenStream获得Token

    2021年11月29日
    42
  • edge浏览器居然自带GPT-5!

    edge浏览器居然自带GPT-5!

    2026年3月15日
    2
  • 自建型呼叫中心

    自建型呼叫中心产品介绍 nbsp nbsp nbsp nbsp nbsp nbsp HQ CtiService3 0 是一款真正意义上的全功能型智能呼叫中心 集 IVR ACD 录音 外呼 坐席 客户管理等功能于一体 按您的要求不同 可选择标准版 企业版 OEM 版 众多行业客户的选择 高稳定性 可轻松扩充至 100 坐席 nbsp nbsp nbsp nbsp 高性价比 一台电脑 几条电话线即可快速搭建自己的呼叫中心 非托管型 万事不求人 支持个性化定制 提供二次开发包 有 CS BS 两种不同

    2026年3月19日
    2
  • 【机器学习中的数学】多项式分布及其共轭分布

    【机器学习中的数学】多项式分布及其共轭分布多项变量(MultinomialVariables)二元变量是用来描述只有两种可能值的量,而当我们遇到一种离散变量,其可以有K种可能的状态。我们可以使用一个K维的向量x表示,其中只有一维xk为1,其余为0。对应于xk=1的参数为μk,表示xk发生时的概率。其分布可以看做是伯努利分布的一般化。现在我们考虑N个独立的观测D={x1,…,xN},得到其似然函数。如图:

    2022年10月11日
    5
  • 用计算机套路别人,套路计算器隐藏版[通俗易懂]

    用计算机套路别人,套路计算器隐藏版[通俗易懂]套路计算器隐藏版是款非常适合撩妹的神器,各种整蛊玩法,套路你的女朋友,操作简单,不需要root免费使用,轻松的哄女朋友开心。套路计算器隐藏版特色1.在这里都可以跟你的好友们设定任何的计算套路。2.在使用的时候看起来就跟普通的计算器应用差不多。3.他的套路秘诀就在输入计算结果之后,会显示提前设定的文字。4.各种的文章内容都可以设定到计算里面。套路计算器隐藏版怎么用进入的先设置好内容,进入后打开的都是…

    2022年6月9日
    140

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号