jnaerator_JAVA程序调用C/C++库_方法三

本文介绍jnaerator工具,可自动生成基于JNA的Java调用C库代码,大幅减少开发工作量。通过实际案例展示如何配置并生成代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自大佬的博客: https://blog.youkuaiyun.com/10km/article/details/79252303



众所周知,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

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

命令行执行如下

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
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

参数说明:

  • -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.hTHFeature_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
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

参考资料

《jnaerator命令行参数说明》:
https://github.com/nativelibs4java/JNAerator/wiki/Command-Line-Options-And-Environment-Variables

### Swin Transformer 论文精读:Hierarchical Vision Transformer Using Shifted Windows Swin Transformer 是一种基于视觉的分层 Transformer 模型,其核心创新在于通过 **Shifted Window-based Self-Attention** 实现了线性计算复杂度,同时能够生成多尺度特征表示。这种方法在图像分类、目标检测和语义分割等任务中取得了显著的性能提升 [^2]。 #### 核心架构概述 Swin Transformer 的整体结构分为多个阶段(Stage),每个阶段包含多个 Swin Transformer Block。这些块使用 **窗口化自注意力机制** 和 **移位窗口策略** 来实现高效计算并捕捉长距离依赖关系。 - **分层特征提取** 类似于传统卷积神经网络(如 ResNet),Swin Transformer 采用分层设计来逐步降低空间分辨率并增加通道维度。这种设计允许模型从局部到全局地构建特征表示。 - **窗口划分与移位窗口机制** 在每个 Swin Transformer Block 中,输入特征图被划分为不重叠的窗口,并在这些窗口内执行自注意力计算。为了增强跨窗口的信息交互,在下一个 Block 中对窗口进行移位操作(Shifted Windows)。这种方式既减少了计算量,又保持了模型对全局信息的感知能力 [^1]。 ```python # 窗口划分伪代码示例 def window_partition(x, window_size): B, H, W, C = x.shape # 将图像划分为多个窗口 x = tf.reshape(x, shape=[B, H // window_size, window_size, W // window_size, window_size, C]) windows = tf.transpose(x, perm=[0, 1, 3, 2, 4, 5]) return tf.reshape(windows, shape=[-1, window_size, window_size, C]) # 移位窗口伪代码 def shifted_window_attention(x, window_size, shift_size): B, H, W, C = x.shape # 对特征图进行滚动操作以实现窗口移位 x = tf.roll(x, shift=(-shift_size, -shift_size), axis=(1, 2)) return window_partition(x, window_size) ``` #### 自注意力机制优化 传统的 Vision TransformerViT)在整个图像上应用自注意力机制,导致计算复杂度为 $O(n^2)$,其中 $n$ 是图像块的数量。而 Swin Transformer 通过将注意力限制在局部窗口内,将复杂度降低到 $O(n)$,使其适用于高分辨率图像处理 [^4]。 此外,移位窗口机制确保了相邻窗口之间的信息流动,从而避免了局部注意力带来的信息隔离问题。这种设计使得 Swin Transformer 能够在保持计算效率的同时实现全局建模能力。 #### 实验结果与性能优势 Swin Transformer 在多个视觉任务中表现出色: - **ImageNet 分类任务**:Swin-Tiny、Swin-Small、Swin-Base 和 Swin-Large 四种变体均在 ImageNet-1K 上实现了优于其他 Transformer 主干网络的 Top-1 准确率。 - **COCO 目标检测**:在 COCO 数据集上,Swin Transformer 在 Faster R-CNN 框架下达到了 SOTA 性能,mAP 超过之前的最佳方法。 - **ADE20K 语义分割**:在 ADE20K 数据集上,Swin Transformer 作为编码器也取得了领先的 mIoU 指标 [^2]。 #### 消融实验分析 论文还进行了详细的消融研究,验证了以下几个关键组件的有效性: - **窗口大小的影响**:较大的窗口有助于捕捉更广泛的上下文,但会增加计算开销。 - **移位窗口的重要性**:实验证明,移位机制可以显著提升模型性能,尤其是在长距离依赖任务中。 - **不同层级的设计**:通过对比不同层级深度和通道配置,论文展示了如何平衡精度与效率 [^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值