jnaerator-java 调用动态库的神器,JNA 代码自动生成工具
众所周知,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 需要下载 jnaerator 的 FatJar 包。
maven 中央仓库下载地址
http://central.maven.org/maven2/com/nativelibs4java/jnaerator/0.12/jnaerator-0.12-shaded.jar
JNA 代码生成
如下图目录结构,有两个 dll,及相对应的头文件,我们这两个动态库为例说明如何用 jnaerator 来生成全套 JNA 代码。
├─bin
│ THFeature.dll
│ THFaceImage.dll
└─include
THFaceImage_i.h
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 文件夹
参考资料
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于