java 的 native 方法

2023-11-01

一、概念

        一个 Native Method 就是一个 java 调用非 java 代码的接口,一个 Native Method 是这样一个 Java 方法:该方法的实现由非 java 语言实现,有可能是 C 语言实现的。

        在定义一个 native method 时,并不提供实现体,因为其实现体是由非 Java 语言在外面实现的可以打开 Object 这个类看看源码,这些函数的实现体在 DLL 中。

        标识符 native 可以与所有其他的 java 标识符连用,但是 abstract 除外,这是合理的,因为 native 暗示这些方法是有方法体的,只不过这些是非 java 的,但是 abstract 却显然的指明这些方法无实现体。

        一个 native method 方法可以返回任何 java 类型,包括非基本类型,而且也可以进行异常控制这些方法的实现体可以自制一个异常并且将其抛出,这一点与 java 的方法非常相似。

        native method 的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM 将控制调用本地方法的所有细节。

        如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用 java 语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被 fianl 标识,它被继承后不能被重写。

二、总结

        本地方法非常有用,因为它有效地扩充了 jvm。事实上,我们所写的 java 代码已经用到了本地方法,在 sun java 的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得 java 程序能够超越 java 运行时的界限。有了本地方法,java 程序可以做任何应用层次的任务。

三、使用方法

        native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如 CC++)实现的文件中。Java 语言本身不能对操作系统底层进行访问和操作,但是可以通过 JNI 接口调用其他语言来实现对底层的访问。

        JNI Java 本机接口(Java Native Interface),是一个本机编程接口,它是 Java 软件开发工具箱(Java Software Development Kit,SDK)的一部分。

        JNI 允许 Java 代码使用以其他语言编写的代码和代码库,Invocation APIJNI 的一部分)可以用来将 Java 虚拟机(JVM)嵌入到本机应用程序中从而允许程序员从本机代码内部调用 Java 代码。

        如果需要实现本地调用,需要考虑几个准则:

        a、将您的所有本地方法都封装到一个类中,这个类调用单个的 DLL。对每一种目标操作系统平台,都可以用特定于适当平台的版本的 DLL。这样可以将本地代码的影响减少到最小,并有助于将以后所需要的移植问题考虑在内。

        b、本地方法尽量简单。尽量使您的本地方法对第三方(包括 Microsoft)运行时 DLL 的依赖减少到最小。使您的本地方法尽量独立,以将加载您的 DLL 和应用程序所需的开销减少到最小。如果需要运行时 DLL,必须随应用程序一起提供。

四、JNI 书写步骤

        a、编写带有 native 声明的方法的 Java

        b、使用 javac 命令编译编写的 Java

        c、使用 java -jni 来生成后缀名为 .h 的头文件

        d、使用其他语言(C、C++)实现本地方法

        e、将本地方法编写的文件生成动态链接库

public class JniTest {

	public native void add(int i);
	static native public long Native2() ;
	private native synchronized float Native3( Object o ) ;
	native void Native4( int[] ary ) throws Exception ;

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

java 的 native 方法 的相关文章

  • 有没有什么工具可以验证@XmlPath注释? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何工具可以在 Eclipse 或 IntelliJIdea java 框架或其他框架编译时验证
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • Arrays.copyOf 产生浅拷贝还是深拷贝?

    对于是否应该这样做 似乎存在很多困惑和不同的意见 1 和其他来源 Arrays copyOf将产生深拷贝或浅拷贝 此测试表明副本很深 String sourceArray new String Foo String targetArray
  • 您最好的 Swing 设计模式和技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Jenkins 中未找到 Maven

    我正在 Jenkins 中运行我的 Maven Spring 项目 只是第一次测试它 使用 shell 脚本选项 mvn spring boot run 我收到构建错误 Users Shared Jenkins tmp jenkins808
  • 如何使用我的 Apple 开发者 ID 签署 .jar 文件

    我有一个java可执行文件jar我需要使用我的 Apple 开发者 ID 进行签名的文件 我不打算通过应用程序商店分发它 我将通过我的网站直接向客户分发该应用程序 我不打算绕过 Gatekeeper Signing the app和我的de
  • 使用 Java Google App Engine 批量加载程序将整个数据存储区下载到一个 csv 文件

    我目前正在使用 kind参数来指定下载的类型和 filename指定要生成的 csv 文件的名称 这 rps limit bandwidth limit and batch size用于加速下载 例如 要下载我正在使用的游戏类型 appcf
  • Groovy 2.0.1,我自己的类上有 GroovyCastException?

    我在我的网络应用程序项目中广泛使用 Groovy 类 我可以创建类型的实例 定义为 groovy 类 但以后永远不能转换回它 GroovyCastException发生 org codehaus groovy runtime typehan
  • 如何从 Coldfusion 2016 中加载 jsoup Java 库?

    TLDR CreateObject 函数会抛出异常 java lang ClassNotFoundException 因为它看不到 java 类 JAR 文件 有什么想法我做错了什么吗 谢谢 Application cfc 的内容
  • 查看tomcat服务器的连接数

    我在 Tomcat Server 5 5 17 上部署了一个 Java Java EE Web 应用程序 我想知道连接到服务器的客户端数量 我们怎样才能找到它呢 最可靠的方法是搜索ip addr of srv port in netstat
  • 如何将一个组件放在其他组件之上?

    我有一个JScrollPanel其中包括一个大面板 其本身包括 3 个内面板 我想将一个面板 例如 放在一个特殊的位置 以便始终可以看到 我的意思是用户可以滚动到想要的任何地方 但该面板始终位于其他组件的顶部并且不会移动 我试图通过这样做J
  • LoggerFactory.getLogger(ClassName.class) 与 LoggerFactory.getLogger(this.getClass().getName())

    我正在努力提高我的 Java 优化技能 为了实现这一目标 我制作了一个旧程序 并且正在尽力使其变得更好 在此程序中 我使用 SL4J 进行日志记录 为了获取记录器 我做了 private static final Logger logger
  • Android Widget 实现

    嗨 如果这个问题很愚蠢 我提前道歉 我对 Android 编程相当陌生 而且学得很快 我刚刚创建了一个任务提醒应用程序 并且想将该应用程序转换 实现为一个可以在主屏幕上查看的小部件 有什么方法吗 这可能吗 Thanks 如果没有更多关于您的
  • Java:如何实现通用二叉搜索树?

    到目前为止 我一直在编写一个 Node 类 class Node private value private Node left private Node right public int getValue return value pub
  • 如何在同一行实例化对象并调用setter?

    如果我有一个Employee具有默认构造函数的类 private String firstName public Employee 和一个二传手 public void setFirstName String firstName this
  • 带句点和逗号的自定义格式数字

    有点相关这个问题 https stackoverflow com questions 4738853 java decimal format parse to return double value with specified numbe
  • 纹理映射和光照顶点着色器错误 Java OpenGL

    我正在尝试将纹理映射到 3D 立方体并尝试编写着色器以使其具有照明和纹理 我尝试过只编写纹理着色器并且它有效 我还尝试过仅将 3D 值设置为红色的照明着色器 并且该照明着色器也可以工作 但当我尝试将两者结合起来时 我遇到了问题 我在下面提供
  • 如何在 JTextArea 中设置部分文本颜色?

    我想为文本区域中的特定行设置颜色 到目前为止我发现的是以下内容 Declarations private final DefaultStyledDocument document private final MutableAttribute
  • JShell 如何查找变量或结果的类型

    如何在 JShell 中查找变量或表达式结果的类型 正在尝试 Java 中的按位运算符 jshell gt byte b 5 lt lt 1 Error incompatible types possible lossy conversio
  • 使用迭代器时无限循环

    Set key1 map keySet Iterator it1 key1 iterator int cnt 0 while it1 hasNext cnt 这段代码导致无限循环的可能性有多大 实际上这会导致无限循环 我怀疑是因为我没有服用

随机推荐

  • Color the ball

    点击打开链接 Problem Description N个气球排成一排 从左到右依次编号为1 2 3 N 每次给定2个整数a b a lt b lele便为骑上他的 小飞鸽 牌电动车从气球a开始到气球b依次给每个气球涂一次颜色 但是N次以后
  • Java内存分析

    程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构中的栈 2 堆区 heap 一般由程序员分配释放 若程序员不释放 程序
  • 若依前端不分离-代码生成

    1 添加菜单 刷新网页后新建的菜单栏就会出现左侧 2 创建数据库表 需要注意的是 表要创建在工程引用的数据库中 另须注意 给重要的字段添加注释 参考后面第11条 3 在若依界面中导入表结构 4 首先点击编辑 将必须填写的选项补充完整 然后点
  • Android平台上最好的几款免费代码编辑器

    概述 使用正确的开发工具能够快速有效地完成源代码的编写和测试 使编程事半功倍 这里介绍了在Android平台上5款最好的代码编辑器 帮助你作出选择 使用正确的开发工具能够快速有效地完成源代码的编写和测试 使编程事半功倍 在网络信息高速发展的
  • 20230703

  • Linux 小插件 lrzsz epel-release

    装lrzsz的作用 就可以直接把windows上面想要装到linux上的东西直接拖拽就可以了 命令 sudo yum install lrzsz 解释 rz 是 receive zmodem 的缩写 中文含义为 接收ZMODEM 这里的接受
  • Python二级(13)——Python第三方库纵览

    一 知识导图 二 网络爬虫方向 1 网络爬虫是自动进行HTTP访问并捕获HTML页 面的程序 Python语言提供了多个具备网络爬 虫功能的第三方库 这里 仅介绍2个常用的 Python网络爬虫库 r e q u
  • JavaWeb学习笔记 day01 HTML 和 CSS

    文章目录 JavaWeb学习笔记 day01 HTML 和 CSS 1 任务 2 课堂笔记 2 1 B S 软件的结构 2 2 前端的开发流程 2 3 网页的组成部分 2 4 HTML 简介 2 5 创建 HTML 文件 2 6 HTML
  • QT 之 QByteArray

    QByteArray类 提供一个字节数组 QByteArray可用于存储原始字节 包括 0 和传统的8位 0 端接字符串 使用QByteArray比使用const char 更方便 除了QByteArray之外 Qt还提供了QString类
  • 成语学习微信小程序源码

    一个学习成员的小程序 分享给大家学习 体验方式 源码下载 链接 https pan baidu com s 1T1q970BTnQxyflzpSlgp8g 提取码 jfcj
  • element 全局$message使用方法(vue中使用和js中使用)

    main js 内配置 import Message from element ui 挂载到 message上 Vue prototype message Message vue中使用 this message warning 111111
  • 使用ffmpeg转换webm格式到MP4格式

    1 cmd 2 切换到ffmpeg安装目录 cd C Program Files x86 Apowersoft Video Editor Pro 3 输入命令 ffmpeg i D djivideos 004 webm b v 2000k
  • python错误--‘list‘ object is not callable可能的原因之一

    目录 第一 代码 第二 第一 代码 功能说明 用正则表达式匹配数字并对数字进行 1操作 然后替换原数字 str literal books 1000 def add1 match val match group num int val 1
  • ❤️如何用Python绘制一个飞机模型??

    VTK在Java Tcl Python中都有接口 本文介绍VTK在Python中的接口 VTK The Visualization Toolkit 是一款用于计算机3D成像 构建模型 图像处理 容积渲染 科学数据可视化等方面的免费软件系统
  • 手把手教你如何使用iometer测试工具测试存储

    原文链接 http www 56itc com index php archives 303 本文主要介绍为广大服务器和存储厂商采用的磁盘性能测试工具 iometer 在 Linux 和 Windows 平台上的安装使用和测试方法 并且对典
  • do msgbox loop_西门子数字量DO扩展模块SM1222

    西门子数字量DO扩展模块SM1222 上海耿湘自动化设备中心是一家集工控产品销售ATV12P075M3 ATV12P037M3施耐德变频器代理商自动化工程设计 开发 改造为一体的高新科技企业 我公司拥有的队伍 针对多种行业自动化的工艺控制需
  • 第九篇 GoogLeNet——论文翻译

    文章目录 摘要 1 引言 2 近期工作 3 动机和高层思考 4 架构细节 5 GoogLeNet 6 训练方法 7 ILSVRC 2014分类挑战赛设置和结果 8 ILSVRC 2014检测挑战赛设置和结果
  • 中大型企业网络规划设计与网络安全实施实战(附topo实验配置环境)

    用户需求 用户隔离 IT VLAN10 HR VLAN20 主机地址通过DHCP方式获取地址 可以通过手工配置地址方式进行测试 网关部署在汇聚层 网关可以进行备份 冗余 VRRP 根据不同VLAN 进行负载 汇聚交换机互联链路 冗余捆绑 e
  • FastAPI从入门到实战(7)——请求体函数的参数设置

    上一篇记录了FastAPI中声明请求体的相关内容 本文记录一下零碎的函数特性和参数特性相关内容 Pydantic schema extra 可以使用 Config 和 schema extra 为Pydantic模型声明一个示例 class
  • java 的 native 方法

    一 概念 一个 Native Method 就是一个 java 调用非 java 代码的接口 一个 Native Method 是这样一个 Java 方法 该方法的实现由非 java 语言实现 有可能是 C 语言实现的 在定义一个 nati