【Java可执行命令】(七)C头文件创建工具 javah:以Java本机接口(JNI)规范创建C头文件,深入解析创建工具javah ~

news2024/11/18 7:46:26

Java可执行命令详解之javah

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 3.1 语法格式
      • 3.1.1 可选参数:-o < file>
      • 3.1.2 可选参数:-classpath < path>
      • 3.1.3 可选参数:-jni
  • 4️⃣ 应用场景
  • 5️⃣ 实现原理
  • 6️⃣ 注意事项
  • 🌾 总结

在这里插入图片描述

1️⃣ 概念

javah 是一个命令行工具,旨在为开发人员提供一种将 Java 类转换为 C/C++ 头文件的方式。它最初作为 Java SE 开发套件的一部分于 JDK 1.0 版本中引入,旨在支持 Java 和本地代码的混合编程。

javah 用于生成包含 JNI(Java Native Interface)函数原型的头文件,以便在使用 JNI 连接 Java 和本地代码时进行编译和链接

它的主要作用是为了在 Java 和 C/C++ 之间建立桥梁,允许 Java 程序调用本地代码功能,并使本地代码能够与 Java 类进行交互。通过生成头文件,开发人员可以将 Java 类的方法映射到本地函数,并为这些函数构建对应的本地实现。

2️⃣ 优势和缺点

  • 优点

    • 方便地将 Java 类连接到本地代码,充分利用底层操作系统的功能;
    • 支持编写高性能的本地代码,以提高某些关键任务的执行效率;
    • 加强了跨平台开发的能力,可以充分利用本地特性,实现更复杂的功能需求。
  • 缺点

    • 使用 JNI 需要额外的学习成本,包括 JNI 编程规范、内存管理等方面的知识;
    • 开发人员需要维护 Java 类和本地代码之间的正确映射关系,增加了一定的复杂性。

3️⃣ 使用

3.1 语法格式

javah 命令的基本语法格式如下:

javah [options] <classes>

其中,options 是可选参数,classes 是要生成头文件的完全限定类名。

javah 命令支持的所有可选参数汇总如下表:

参数作用
-o <file>输出文件 (只能使用 -d 或 -o 之一)
-d <dir>输出目录
-v-verbose启用详细输出
-h--help-?输出此消息
-version输出版本信息
-jni生成 JNI 样式的标头文件 (默认值)
-force始终写入输出文件
-classpath <path>从中加载类的路径
-cp <path>从中加载类的路径
-bootclasspath <path>从中加载引导类的路径

上面表格汇总了javah的所有可选参数,读者可以根据自己的需求参照表格选择所需参数。下是主要介绍一些常用的 javah可选参数:

  • -o <file>:指定输出的头文件名称;
  • -classpath <path>:设置查找类文件的路径;
  • -jni:表示生成用于 JNI 的头文件。

3.1.1 可选参数:-o < file>

javah -o <file> classes 命令的作用是生成包含 JNI 函数原型的 C/C++ 头文件,并将其写入指定的文件中。

其中,<file> 是指定要写入的文件的路径和名称,classes也即fully.qualified.classname 是要生成头文件的完全限定类名。

以下步骤演示了如何使用该命令及其作用:

  1. 使用以下命令,将一个名为 com.xiaoshan.MyClass 的 Java 类生成头文件并保存为 MyClass.h

    javah -o MyClass.h com.xiaoshan.MyClass
    

    执行命令后,会在当前目录下生成一个名为 MyClass.h 的头文件,其中包含与 com.xiaoshan.MyClass 类相关的 JNI 函数原型。

  2. 生成的头文件可以用于编写本地代码,实现与 Java 类的交互。你可以通过包含该头文件来在 C/C++ 代码中调用 Java 类的方法或访问其成员。

使用 javah -o <file> 命令可以方便地为 Java 类生成与 JNI 接口对应的 C/C++ 头文件。C/C++ 头文件内容为:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_xiaoshan_MyClass */

#ifndef _Included_com_xiaoshan_MyClass
#define _Included_com_xiaoshan_MyClass
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

3.1.2 可选参数:-classpath < path>

javah -classpath <path> classes 命令的作用是设置要在查找类文件时使用的路径。

其中,<path> 是指定要使用的类文件路径,可以是一个目录或包含多个目录路径的冒号分隔列表。classes 是要生成头文件的完全限定类名。

下面演示如何使用该命令及其作用:

  1. 现在有一个 com.xiaoshan.MyClass 的 Java 类,并且该类所在的类文件位于 /path/to/classes 目录下,则可以执行以下命令:

    javah -classpath /path/to/classes com.xiaoshan.MyClass
    

    执行命令后,javah 将根据 -classpath 参数指定的路径在其中查找类文件,并为 com.xiaoshan.MyClass 生成相应的 C/C++ 头文件。

  2. 运行命令后,javah 将会根据指定的类路径查找类文件,并生成相应的头文件。生成的头文件可以用于编写本地代码,实现与 Java 类的交互。

使用 javah -classpath <path> 命令可以设置要在查找类文件时使用的路径,确保 javah 能够正确地找到要生成头文件的 Java 类。

3.1.3 可选参数:-jni

javah -jni 命令的作用是生成用于 JNI(Java Native Interface)的头文件。这意味着生成的头文件会符合 JNI 的函数命名规则,以便与 Java 代码进行交互。

下面演示如何使用该命令及其作用:

  1. 现在希望名为 com.xiaoshan.MyClass 的 Java 类生成的头文件符合 JNI 的命名规范,可以执行以下命令:

    javah -jni com.xiaoshan.MyClass
    

    运行命令后,javah 将会生成一个符合 JNI 命名规范的头文件,其中包含与 com.xiaoshan.MyClass 类相关的 JNI 函数原型。

  2. 生成的头文件可以用于编写本地代码,实现与 Java 类的交互。通过 JNI 的函数命名规则,你可以在 C/C++ 代码中调用 Java 类的方法或访问其成员。

使用 javah -jni 命令可以方便地生成用于 JNI 的头文件,并确保与 Java 代码的交互遵循 JNI 函数命名规则。这样,你就能够在本地代码中正确调用 Java 类的方法并与之进行交互。

4️⃣ 应用场景

javah 命令主要在以下场景中发挥作用:

  • 在 Java 程序中使用 JNI 连接本地代码时,需要生成对应的 C/C++ 头文件;
  • 需要优化 Java 程序的性能,将部分关键任务委托给本地代码实现。

5️⃣ 实现原理

javah 命令通过分析 Java 类及其方法的签名信息,生成与之对应的 C/C++ 函数原型。具体过程如下:

  1. 根据指定的类名或包名,javah 定位到相应的类文件;
  2. 解析类文件的结构,提取类和方法的相关信息,包括类名、方法名、参数列表和返回类型等;
  3. 将提取的信息转换为 C/C++ 函数原型,并生成相应的头文件;
  4. 头文件中包含了 JNI 的函数命名规则,以便与 Java 代码进行交互。

6️⃣ 注意事项

  1. javah 只能应用于具有 native 关键字声明的方法,用于标识应该由本地代码提供实现;
  2. 如果涉及到依赖其他类的本地方法,需确保这些类在运行时可用;
  3. 在执行 javah 命令时,必须指定一个有效的输出路径。

🌾 总结

javah 是一个有用的工具,可以方便地将 Java 类连接到 C/C++ 代码中。它允许开发人员通过生成 JNI 头文件来建立 Java 和本地代码之间的桥梁,实现高效的跨平台开发。尽管涉及一定的学习成本和复杂性,但对于需要与底层操作系统交互或提高性能的情况下,使用 javah 是一个很好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win系统安装配置minio笔记

win系统安装配置minio笔记 下载win64版本的minio.exe 可以去minio官网下载&#xff0c;也可以直接在csdn下载&#xff0c;这里提供一个下载地址 https://download.csdn.net/download/ThinkPet/87976200?spm1001.2014.3001.5501配置并启动minio.exe 可以在cmd命令里执行 m…

k8s calico ipip模式详解

一、简介 Calico 是一种容器之间互通的网络方案。在虚拟化平台中&#xff0c;比如 OpenStack、Docker 等都需要实现 workloads 之间互连&#xff0c;但同时也需要对容器做隔离控制。而在多数的虚拟化平台实现中&#xff0c;通常都使用二层隔离技术来实现容器的网络&#xff0c…

毕业喽 ! ——为赋新词强说愁

文章目录 一、引言二、回首六年三、腾讯实习四、遗憾和展望 一、引言 临近毕业&#xff0c;满头思绪&#xff0c;满腔感概&#xff0c;不知从何说起&#xff0c;对离别的不舍、对学生时代即将落幕的留恋和感慨、对即将只身踏入社会的迷茫和不安。果真应验了杜甫老先生的那句话—…

MATLAB散点图绘制

clfx linspace(-3*pi,3*pi,100);y sin(x);color linspace(1,10,length(x));scatter(x,y,25,color,filled);hold onscatter(x0.25*pi,y,100,[0 0 0],*); 大部分时候处理数据还是散点图用的比较多 这里主要是scatter函数&#xff0c;用法是&#xff1a; scatter&#xff08…

华为OD机试真题 Python 实现【机房布局】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、解题思路六、Python算法源码七、效果展示1、输入2、输出 一、题目描述 小明正在规划一个大型数据中心机房&#xff0c;为了使得机柜上的机器都能正常满负荷工作&#xff0c;需要确保在每个机柜边上至少要有一个电箱…

pytorch3d 安装报错 RuntimeError: Not compiled with GPU support pytorch3d

安装环境 NVIDIA GeForce RTX 3090 cuda 11.3 python 3.8.5 torch 1.11.0 torchvision 0.12.0 环境安装命令 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch安装pytorch3d参考官网链接 https://github.com/facebookresearch/p…

Java 的拷贝(深拷贝、浅拷贝)

在对象的拷贝中&#xff0c;很多初学者可能搞不清到底是拷贝了引用还是拷贝了对象。在拷贝中这里就分为引用拷贝、浅拷贝、深拷贝进行讲述。 引用拷贝 引用拷贝会生成一个新的对象引用地址&#xff0c;但是两个最终指向依然是同一个对象。如何更好的理解引用拷贝呢&#xff1…

工具类之打印表格ByList

前言 昨天在测试应用的时候&#xff0c;因为要查看数据库表里面的数据&#xff0c;但是又懒得去看数据库里面查找那张表&#xff0c;反而直接代码查看更方便。于是做了一个打印List的工具类&#xff0c;可以将List里面的数据进行打印成一个表格展示&#xff0c;List里面的元素…

CH543乐得瑞单C口显示器方案(LDR6020)

首先显示器的种类很多&#xff0c;有桌面显示器&#xff0c;便携显示器&#xff0c;智能显示器&#xff0c;甚至AR眼镜也可以算是一个微型显示器。以往的显示器传输视频信号多为VGA和HDMI,当然DP也有&#xff0c;只是占少数&#xff0c;再早之前还有模拟信号接口等等&#xff0…

牛客网基础语法91~100题

牛客网基础语法91~100题&#x1f618;&#x1f618;&#x1f618; &#x1f4ab;前言&#xff1a;今天是咱们第九期刷牛客网上的题目。 &#x1f4ab;目标&#xff1a;对短除法的使用&#xff0c;对函数的递归使用熟练。 &#x1f4ab;鸡汤&#xff1a;绊脚石乃是进身之阶。先干…

手机便签软件推荐 有没有什么好用的手机便签软件app

在外出需要记事的时候&#xff0c;很多人会使用手机上的便签工具来完成。那手机便签软件推荐哪个比较好&#xff0c;有没有好用的手机便签软件app推荐呢&#xff1f;下面小编就为大家推荐一些用起来体验很不错的手机便签app软件。 一、敬业签 敬业签具备多种便签记事和提醒方式…

使用Spring Boot、MyBatis Plus和Elasticsearch配置的简单示例

下面是一个使用Spring Boot、MyBatis Plus和Elasticsearch的简单示例&#xff1a; 首先&#xff0c;在pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elast…

本地文件如何复制到服务器上 180.188.22.X

当我们在远程服务器时&#xff0c;有时会想要直接在本地电脑上复制文本到服务器上&#xff0c;或者把服务器上的文本文件复制到电脑上却无法进行操作。当我们遇到这样的情况&#xff0c;应该如何处理呢。系统如果是Windows的情况下&#xff0c;可以进行以下操作&#xff1a;打开…

【MySQL】不允许你不了解如何分组数据

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

Nginx安装、卸载教程(含Window、Linux版、Docker版)

目录 一、下载 二、Linux版安装 2.1 编译安装之前 2.2 编译安装 2.3 启动Nginx 2.4 关于防火墙 2.5 安装成系统服务 三、Linux版卸载&#xff08;彻底&#xff09; 3.1 检查一下Nginx服务是否在运行 3.2 停止Nginx服务 3.3 查找、删除Nginx相关文件 3.4 再使用yum清…

C++11新特性(5):多线程

学习C11&#xff0c;根据网上资料的知识总结。 1. 线程创建 1.1 初始函数 #include <iostream> #include <thread> void myfunc(int &a) {cout << "a in myfunc:" << a << endl; }int main() {int a 1;std::thread mythread(…

Solr框架 02.Solr操作(document操作和query查询)

菜单项目Documents使用办法 其中的document选项&#xff1a; 以XML格式举例 1新增/修改 当id不存在时新增&#xff0c;当id存在修改。 <doc> <field name"id">8</field> <field name"name">明天更大卖</field> <field n…

好处多多的数仓分层是怎么样子的呢?如何创建数仓分层,

一、创建数仓分层 数仓分层是结合对业务场景、实际数据、使用系统的综合分析&#xff0c;对数据模型进行的整体架构设计及层级划分。用于将不同用途的数据&#xff0c;归类划分至不同的分层&#xff0c;便于您更好地组织、管理、维护数据。本文为您介绍如何创建并管理数仓分层…

Nik Dfine 降噪滤镜

Nik Define 是 Nik Collection 中专门用于降噪的滤镜。 Nik Dfine 有三种降噪方式&#xff1a;自动、手动以及精细局部控制。 大部分照片的降噪&#xff0c;用自动模式就可以达到满意效果。 有所侧重的话&#xff0c;可考虑手动降噪或精细局部控制方式降噪。 返回 Ps 后&#x…

JMeter分布式压测,启动执行机器报错: Port already in use: 1099

Problem creating registry: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use (Bind failed) 当压测量大的时候我们有时候会失败&#xff0c;然后再接着压测&#xff0c;这样就容易造成端口…