详解Java中native方法的使用

2023-11-04

和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 _ nativetest _ 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中使用本机方法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

原文地址:http://www.ccttoo.com/html/2342.html

本文来自网络,不代表菜鸟教程之家立场,转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解Java中native方法的使用 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • uboot内存操作命令

    uboot内存操作命令命令用于直接对DRAM进行读写操作 常用命令有md nm mm mw cp cmp 1 md 命令格式 md b w l address of objects b w l 分别代表byte 1Byte word 2By
  • java和python二进制文件不能直接读取的解决方案

    前一阵在做一个项目时 会用到java和python 上下游的关系 java写 python读 但是发现两者的二进制文件无法直接读取 后来发现是由于编码的原因 比如在写入int时 一个是从左到右开始编码 一个是从右到左 所以无法直接读取 因此
  • opengl读取网格数据绘制三维物体_交互式三维绘图库(WxGL)速览

    WxGL是一个基于PyOpenGL的三维数据可视化库 以wx为显示后端 提供Matplotlib风格的交互式应用模式 同时 也可以和wxPython无缝结合 在wx的窗体上绘制三维模型 WxGL提供了一套简洁易用 对用户友好的API 将Op
  • 大龄失业超过半年,人生一劫,如何过关?

    在倒闭潮 裁员潮不断侵袭之下 如今的职场主打的就是一个惨烈 前一阵 38岁985硕士失业几个月被迫送外卖 的新闻 曾引起了不小的震动 同样也引起了很多人的共鸣 今天就来聊聊职场上的恐怖故事 如果将大龄 失业 超过半年这三个关键信息组合在一起
  • python使用openpyxl读取excel文件里的超链接文字与URL

    可以使用openpyxl这个库 pip install openpyxl 读取URL的示例代码 import openpyxl wb openpyxl load workbook data 文件 xlsx 读取文件 main sheet w
  • 秒杀多线程第二篇 原子操作 Interlocked系列函数

    秒杀多线程第二篇 原子操作 Interlocked系列函数 上一篇 CreateThread与 beginthreadex本质区别 中讲到一个多线程报数功能 为了描述方便和代码简洁起见 我们可以只输出最后的报数结果来观察程序是否运行出错 这
  • 在socket中使用域名

    客户端中直接使用IP地址会有很大的弊端 一旦IP地址变化 IP地址会经常变动 客户端软件就会出现错误 而使用域名会方便很多 注册后的域名只要每年续费就永远属于自己的 更换IP地址时修改域名解析即可 不会影响软件的正常使用 关于域名注册 域名
  • vtk数据交互的两种方式之回调函数、vtkCommand

    参考博客 VTK交互之vtkCommand 阿兵 AI医疗的博客 CSDN博客 vtkcommand 一 观察者 命令模式 VTK中用的较多的设计模式是 观察者 命令模式 Observer Command 要实现数据交互 主要基于观察者 命
  • mysql8 zip安装_windows10+mysql8.0.zip安装

    准备 环境 Windows 10 一 安装 1 解压zip包到安装目录 比如我的安装目录是 D Program MySQL 2 配置文件 在Windows系统中 配置文件默认是安装目录下的 my ini 文件 部分配置需要在初始安装时配置
  • t_1链表

    双指针 其实这是第一次接触这种算法概念 之前数据结构课堂上学习到的链表是非常基础和入门的 稍微进阶点的还得自己找资料学习 找题目练习 双指针 Two Pointers 指的是在遍历元素的过程中 不是使用单个指针进行访问 而是使用两个指针进行
  • 【Kaggle】【Titanic】【AutoGluon】测试

    文章目录 安装 训练 预测 提交方式 Competition首页 Notebook首页 结果 Reference 安装 pip install autogluon 安装autogluon 训练 from autogluon tabular
  • 第17章 站点构建

    mini商城第17章 站点构建 一 课题 站点构建 二 回顾 1 Gateway限流 2 Nginx限流 3 Redis集群应用 4 缓存灾难处理 三 目标 1 Sentinel Sentinel介绍 Sentinel核心功能 Sentin
  • 深度学习之学习(3-3)YOLOV2

    参见 目标检测论文阅读 YOLOv2 知乎 二 更快更准 YOLOv2 2 1 简介 2017年 作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上 进行了大量改进 提出了 YOLOv2 和 YOLO9
  • 少样本NER的方法

    论文 Few Shot Named Entity Recognition A Comprehensive Study 速看 微软 韩家炜课题组的全面调研 NER标注数据少 怎么办 论文总结了少样本ner的三种方法 方案1 原型方法 Prot
  • Qt应用程序设计(二):窗口与部件

    一 部件基类继承表 二 窗口部件QWidget 1 窗口与子部件 窗口部件 Widget 简称部件 是Qt中建立用户界面的主要元素 像主窗口 对话框 标签 按钮 文本输入框等都是窗口部件 这些部件可以接受用户输入 显示数据和状态信息 并且在
  • Qt中出现错误:Cannot find Makefile. Check your build settings.

    错误 Cannot find Makefile Check your build settings Error while building deploying project untitled1 kit Desktop Qt 5 14 1
  • __attribute__((visibility(“default“)))含义

    GCC的visibility属性用来控制 so文件的符号表 也就是控制外部能不能找到符号调用 比如函数 变量 模板 类等 符号表分静态的 symtab 和动态的 dynsym 一个对应链接视图另一个对应执行视图 设置为 hidden 符号将
  • 卷积神经网络中的即插即用模块

    卷积神经网络中的即插即用模块 是首发于GiantPandaCV公众号的电子书教程 由pprp总结并整理了常见的即插即用模块 可以分为注意力模块和其他模块 通过这篇电子书中的模块结合 从零开始学习YOLOv3 中的在YOLOv3模型中添加At
  • L3-018 森森美图 (30 分)

    题目 题目链接 题解 BFS 先看看样例咋出来的吧 判断某个坐标属于起点终点连线的哪一侧的时候 我们采用是将点代入起点终点的两点式中根据正负值判断 两次bfs更新起点到终点的 距离 bfs每次扩展一个点 用起点到该点的 距离 更新其八个方向
  • 详解Java中native方法的使用

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