dll、so库转Java代码

2023-11-06

众所周知,java程序如果要调用动态库(.so,.dll)的函数,最传统方式是使用JNI技术,用JNI写java调用接口代码是非常痛苦的,调试也是比较麻烦的事儿,JNA推出后,大大降低了开发难度,java程序员只要为对应的动态库定义java native方法代码,为对应的C数据结构写出java对象,就可以了,不需要再为了调用动态库而写c/c++程序。
相比JNI,JNA是一个很大的进步,但java程序还是要写一些java代码才能正确调用动态库,动态库函数涉及的所有结构类型都需要定义对应的java类型,如果结构类型比较多是个很大的工作量。
能不能更简单一些呢?
最近正为写调用动态库的事儿头痛,虽然我也会写JNI代码,但实在太麻烦,总想找个捷径,看了JNA相关资料后,发现用JNA所需要写的相关java代码其实都是很有规则的。既然这样,会不会有提供JNA代码生成的开源工具呢?
在google上七找八找的,居然找到了。这就是jnaerator
jnaerator是google贡献的一个开源项目,用于生成基于JNA/BridJ的调用C/Object-C语言动态库的java代码的代码生成工具。有了这个神器,你可以不需要为了调用动态库而手工写哪怕一行代码。
本文以实际举例的方式,介绍jnaerator的简单用法。
jnaerator可以命令行执行,也可以以maven插件方式运行,本文只介绍命令行执行方式。

下载jar

jnaerator-0.12-shaded.jar

JNA代码生成

如下图目录结构,有dll,及相对应的头文件,以此为例说明如何用jnaerator来生成全套JNA代码。

├─bin
│     THFeature.dll
│     THFaceImage.dll
└─include
       THFaceImage_i.h
       THFeature_i.h

命令行执行如下

java -jar d:\download\jnaerator-0.12-shaded.jar \
    -runtime JNA \
    -mode Maven \
    -mavenGroupId net.gdface \
    -mavenArtifactId cassdk_jna \
    -o jna_code
    -package net.gdface.jna
    -f \
    -library THFaceImage \
    bin\THFaceImage.dll include\THFaceImage_i.h 
    -library THFeature \
    bin\THFeature.dll include\THFeature_i.h

参数说明:

・ -runtime JNA
指定目标运行库为JNA,
-runtime 可选的值有(区分大小写):
JNA
JNAerator (based on JNA)
BridJ
支持 C++库
NodeJS
但是实测发现使用BridJ 是有问题的,NodeJS没试过
・ -mode Maven
指定输出模式为Maven
-mode可选的值(区分大小写):
Jar : JAR 生成jar包,可以使用-jar指定生成的jar包文件名
StandaloneJar : 生成包含所有依赖库的jar ,可以使用-jar指定生成的jar包文件名
Directory : 生成代码到文件夹
Maven : 生成maven格式的项目(pom.xml)
AutoGeneratedMaven : 生成maven格式的项目(pom.xml),执行mave install 自动编译生成jar包,不生成源码
・ -mavenGroupId net.gdface
指定 maven项目的 groupId
・ -mavenArtifactId cassdk_jna
指定 maven项目的 artifactId
・ -o jna_code
指定输出文件夹 jna_code
・ -package net.gdface.jna
指定生成java代码的包名。如果不指定,则默认包名为 library name
・ -f
生成代码时强制覆盖已经存在的文件
・ -library THFaceImage -library THFeature
指定后面的动态库的名称(library name),在这里为”THFeature.dll”,如果不指定则library name 为 头文件名称:‘THFeature_i’,
NOTE:-library就是个状态参数,只对其后面的文件名参数有效,所以这里用两次-library分别为THFeature_i.h和THFeature_i.h指定了不同的动态库名称
・ bin\THFeature.dll include\THFeature_i.h
bin\THFeature.dll include\THFeature_i.h
指定要生成代码的动态库和对应头文件,前后顺序无关,可以不提供动态库文件名称,只需要.h文件就可以生成JNA代码

生成的maven项目代码结构如下

J:\WORKSPACE.NEON\CASSDK54\CASSDK\CASSDK_WINDOWS_X86_64\JNA_CODE
│  pom.xml
│  
└─src
    └─main
        ├─java
        │  └─net
        │      └─gdface
        │          └─jna
        │                  EF_Param.java
        │                  FaceAngle.java
        │                  THFeatureLibrary.java
        │                  THFaceImageLibrary.java
        │                  THFI_FacePos.java
        │                  THFI_Param.java
        │                  THFI_Param_Ex.java
        │                  TH_Image_Data.java
        │                  
        └─resources
            └─lib
                └─win64
                        THFeature.dll
                        THFaceImage.dll

NOTE:如果生成代码时不提供bin\THFeature.dll,THFaceImage.dll,则生成的文件夹中没有resource文件夹

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

dll、so库转Java代码 的相关文章

  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 带等待/通知的同步块与不带等待/通知的同步块之间的区别?

    如果我只是使用synchronized 不是wait notify方法 它仍然是线程安全的吗 有什么不同 Using synchronized使方法 块一次只能由一个线程访问 所以 是的 它是线程安全的 这两个概念是结合在一起的 而不是相互
  • “强制更新快照/版本” - 这是什么意思

    在 Maven 项目中 选择 更新项目 时 有一个名为 强制更新快照 版本 的选项 它有什么作用 强制更新快照 版本 就像运行以下命令 mvn U install U 也可以用作 update snapshot 看here http boo
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • EWS - 给予预约,获取预约的所有者副本

    在 EWS 中进行预约后 是否可以获得所有者的副本 例如 如果我登录为user1 我有user1创建的约会的副本user2 我有冒充权 我要编辑user2预约的副本 我怎样才能获得user2 s copy 您可以使用 PidLidClean
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 参数数量在编译时确定的 Lambda 函数

    我想声明一个带有 N 个参数的 lambda 函数 其中 N 是模板参数 就像是 template
  • Android - 从渲染线程内结束活动

    下午好 我不熟悉 android 中的活动生命周期 并且一直在尽可能地阅读 但我不知道如何以良好的方式解决以下问题 我有一个使用 GLSurfaceView 的活动来在屏幕上绘制各种内容 在这个 GLSurfaceView 的渲染线程中 我
  • 没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

    我正在尝试使用 EclipseLink 在 Glassfish 中使用 JPA 编辑 Postgresql 中的表 当我插入一个实体时 它运行良好 但是 当我尝试编辑或删除同一实体时 它失败并出现以下错误 任何想法 Caused by Ex
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList

随机推荐

  • 用人工智能压缩图像的尝试2

    收集42亿个8 8像素图 对它们排序 让形状接近的图排在接近的位置 然后输入ANN1 它以8 8 3字节为输入 32比特为输出 再训练ANN2 它以32比特index为输入 8 8的pixels为输出 总数据量为 8 8 3 4 B 4G
  • python中generate什么意思_python generate怎么用

    generate语句允许细化时间 Elaboration time 的选取或者某些语句的重复 这些语句可以包括模块实例引用的语句 连续赋值语句 always语句 initial语句和门级实例引用语句等 细化时间是指仿真开始前的一个阶段 此时
  • HNCTF week1

    Xor 代码分析 puts please input your flag scanf s Str 输入22个字符串 if strlen Str 22 printf strlen error exit 0 将输入的22个字符与0x34进行异或
  • vue学习之父子组件及插槽

    父子组件 父子组件是组件之间的一种关系 这个关系并不是绝对的 而是相对的 通常 如果在A组件中 使用 了B组件 那么就称A组件为B组件的父组件 相应地 B组件就称为A组件的子组件
  • 动手学CV-目标检测入门教程5:损失函数

    3 5 损失函数 本文来自开源组织 DataWhale CV小组创作的目标检测入门教程 对应开源项目 动手学CV Pytorch 的第3章的内容 教程中涉及的代码也可以在项目中找到 后续会持续更新更多的优质内容 欢迎 如果使用我们教程的内容
  • php数组转xml

    span style font family none ar array span auth gt array user gt customer password gt password context gt 4 owner gt arra
  • 二、一个简单的两层神经网络的实现

    目录 一 numpy实现 二 pytorch实现 1 手动求导 2 自动求导 三 torch nn torch optim实现实现 1 torch nn实现自动求导 2 optim选择并执行各种优化方法 3 继承torch nn Modul
  • 16课:关于Springboot和@Cacheable注解拉去缓存,@CacheEvict清空缓存的原理

    16课 关于Springboot和 Cacheable注解拉去缓存 CacheEvict清空缓存的原理 简介 代码展示 1 pox xml 2 application properties文件 3 RedisCacheableConfig缓
  • ARM开发板介绍及SRAM和SDRAM的区别

    开发板型号 tiny 4412 核心板 exynos4412 三星 SOC ARM架构 ARMv7 架构 coretex A9系列 四核1 4Ghz 32 bit SRAM 256K ROM 16K DDR SDRMD 1Gbyts 内存物
  • vue父组件监听子组件生命周期

    还是记一下吧 总是忘 通过在子组件生命周期里公开一个事件 通过父组件监听 在子组件中 mounted this emit mounted mounted 触发了 父组件监听
  • 解决AD 敷铜连不上焊盘的问题

    一 如下选择 第二步 点击 添加 新建一个网络点 GND 网络名 GND 然后点击 确定 第三步 选择需要连线的焊盘 Net处选择 GND 第四步 选择敷铜按钮 网络选项中 链接到网络选择 GND 结果
  • C++多态的理解

    1 多态的概念及分类 多态是面向对象程序设计的一个重要特征 多态的字面意思就是多种状态 在面向对象的程序设计中 一个接口 多种实现即为多态 c 的多态性具体体现在编译和运行两个阶段 编译时多态是静态多态 在编译时就可以确定使用的接口 运行时
  • 查找一个数组中出现次数最多的元素。(c于c++)

    三键三连 输入输出 输入 n n lt 100 n个元素值 输出 数组中出现次数最多的元素 样例 输入样例 1 3 1 1 2 输出样例 1 1 include
  • 关于删除redis缓存

    验证环境的redis有三个节点 你必须三个节点的缓存数据都删掉 删掉之后记得要到系统工具里面刷新缓存 别单词地就是删了缓存就不管了 CROSSSLOT Keys in request don t hash to the same slot这
  • 可以赚钱的网络游戏?这六款也许有你想要的!

    随着人们生活水平的提高 娱乐方式也趋向多样化 而网络游戏已经成为当代人生活中不或缺的娱乐项目之一 所谓人生如戏 现实生活中 我们总是受各种因素的约束 没有办法得到释放 而网络游戏却开启了我们的第二人生 很多在现实中无法实现的梦想 我们都可以
  • 学习笔记--配置DHCP服务器(基于接口的地址池)

    一 开启DHCP功能 并且把相应端口加入VLAN 并且设置vlan网关1 开启dhcp功能 Huawei dhcp enable 2 创建vlan 10 20 Huawei vlan batch 10 20 3 把g0 0 1 跟g0 0
  • 分组转发算法

    1 首先从IP数据报首部提取出目的主机的IP地址D 得出其所在的网络N 2 若N就是与此路由器直接相连的某个网络 则进行直接交付 不需要经过其它的路由器 进行转发 直接把数据报交付给目的主机 否则就执行 3 3 若路由表中有目的地址为D的特
  • torch包下载和安装失败的解决

    今天打算使用python的 torch包的时候 输入pip install torch 在pycharm下载一直失败 报错信息里面提示一开始是pip版本出错 WARNING You are using pip version 20 0 2
  • ora-30926:无法在源表中获得一组稳定的行

    解决办法 原表的数据保证唯一 可以distinct
  • dll、so库转Java代码

    dll so库转Java代码 下载jar JNA代码生成 参数说明 生成的maven项目代码结构如下 众所周知 java程序如果要调用动态库 so dll 的函数 最传统方式是使用JNI技术 用JNI写java调用接口代码是非常痛苦的 调试