jnaerator:java调用动态库的神器,JNA代码自动生成工具
2018-02-04 15:15
3251 查看
众所周知,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插件方式运行,本文只介绍命令行执行方式。
maven中央仓库下载地址:
http://central.maven.org/maven2/com/nativelibs4java/jnaerator/0.12/jnaerator-0.12-shaded.jar
命令行执行如下
参数说明:
-runtime JNA
指定目标运行库为JNA,
JNA
JNAerator (based on JNA)
BridJ
支持 C++库
NodeJS
但是实测发现使用BridJ 是有问题的,NodeJS没试过
-mode Maven
指定输出模式为Maven
Jar : JAR 生成jar包,可以使用
StandaloneJar : 生成包含所有依赖库的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 name),在这里为”THFeature.dll”,如果不指定则library name 为 头文件名称:‘THFeature_i’,
NOTE:
指定要生成代码的动态库和对应头文件,前后顺序无关,可以不提供动态库文件名称,只需要.h文件就可以生成JNA代码
生成的maven项目代码结构如下
NOTE:如果生成代码时不提供
相比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
命令行执行如下
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文件夹
参考资料
《jnaerator命令行参数说明》相关文章推荐
- 自动生成代码工具【JAVA版】
- PHP 自动生成帮助文档工具1.0Beta版【代码维护神器】
- java代码自动生成UML-工具集
- 使用svcutil工具自动生成wcf调用的客户端代码和配置文件
- MyBatisGenerator 自动生成java代码(反向工具)
- 代码在线自动生成工具,在线生成java代码,springmvc框架,mapper,实体类,控制器,页面代码
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
- 【Android】Android Layout Binder——根据layout布局文件自动生成findViewById的java代码的神器
- UML工具推荐 Poseidon版本 可以免费下载,自动生成代码 C++ Java C# VB.NET等 (来自德国汉堡的国际性建模软件开发商Gentleware AG的)
- IBM将公布能够自动生成Java代码的编程工具
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
- Android_10_java调用C(借助NDK工具自动生成.so)
- 自己写的一个代码自动生成工具_java版_源码下载
- JAVA中Mybatis连接oracle数据库自动生成代码工具
- 代码自动生成工具_java版
- JAVA 自动生成对应数据库表的JPA代码工具
- 代码自动生成工具(二)-miniproto的java库实现
- Java Web开发中可否自动生成结构一致的代码?
- ibatis - 自动代码生成工具abator 使用介绍
- 如何在Eclipse中使用ibatis的自动代码生成工具Abator