开发者社区> helixcs> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JNA 实际开发中若干问题解决方法

简介: JNA 实际开发中若干问题解决方法
+关注继续查看

JNA 实际开发中若干问题解决方法

很早就已经听说过 JNI(Java Native Interface)Java 本地接口,奈何调用本地动态链接库太过于复杂,就一直没有再尝试。而最近因为工作需要调用 Windows DLL 动态链接库(对应 Linux 中 so 文件),而对 JNA 有了入坑体验,对实际工作中遇到的问题做出总结。

1. 调用 Windows 窗口打印Hello World

  1. pom 依赖
<dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>latest</version>
        </dependency>
  1. JNA 在加载驱动时提供两种加载方式 , 直接映射接口生成

接口生成

public interface HelixcsDll extends StdCallLibrary {
        // loadLibary 为动态链接库加载目录
        HelixcsDll HELIXCS_DLL = Native.loadLibrary("helixcs.dll", HelixcsDll.class);
        // 在 dll 中存在相同 SomeFunction 的函数 
        void SomeFunction(String content);
    }
    
    // 调用
    HelixcsDll.HELIXCS_DLL.SomeFunction("Hello World");

直接映射

class Helixcs{
        static {
            Native.register("helixcs.dll");
        }
        // 映射为本地方法
        public static  native void SomeFunction(String content);

        public static void main(String[] args) {
            SomeFunction("Hello World");
        }
    }

2. C 类型和 Java 类型映射。

  1. JNA 官方提供的默认类型映射

Default Type Mappings 默认类型映射

Java primitive types (and their object equivalents) map directly to the native C type of the same size.

Java 原始类型以相同的大小映射 C 类型。

char 8-bit integer byte BYTE, TCHAR
short 16-bit integer short WORD
wchar_t 16/32-bit character char TCHAR
int 32-bit integer int DWORD
int boolean value boolean BOOL
long 32/64-bit integer NativeLong LONG
long long 64-bit integer long __int64
float 32-bit FP float
double 64-bit FP double
char* C string String LPTCSTR
void* pointer Pointer LPVOID, HANDLE, LPXXX

未签名类型作为签名类型来映射。 C 中枚举类型可替换为 “int”。

Unsigned types use the same mappings as signed types. C enums are usually interchangeable with "int".

3. 官方提供的详细的类型映射

Marshalling/Unmarshalling (Java/Native Type Conversions)

C Type Native Representation Java Type
char 8-bit integer byte
wchar_t platform-dependent char
short 16-bit integer short
int 32-bit integer int
int boolean flag boolean
enum enumeration type int (usually)
long long, __int64 64-bit integer long
float 32-bit floating point float
double 64-bit floating point double
pointer (e.g. void*) platform-dependent (32- or 64-bit pointer to memory) Buffer
Pointer
pointer (e.g. void*),
array
32- or 64-bit pointer to memory (argument/return)
contiguous memory (struct member)
<P>[](array of primitive type)
In addition to the above types, which are supported at the native layer, the JNA Java library automatically handles the following types. All but NativeMapped and NativeLong are converted to Pointer before being passed to the native layer.
long platform-dependent (32- or 64-bit integer) NativeLong
const char* NUL-terminated array (native encoding or jna.encoding) String
const wchar_t* NUL-terminated array (unicode) WString
char** NULL-terminated array of C strings String[]
wchar_t** NULL-terminated array of wide C strings WString[]
void** NULL-terminated array of pointers Pointer[]
struct*
struct
pointer to struct (argument or return) (or explicitly)
struct by value (member of struct) (or explicitly)
Structure
union same as Structure Union
struct[] array of structs, contiguous in memory Structure[]
void (*FP)() function pointer (Java or native) Callback
pointer (<T> *) same as Pointer PointerType
other integer type IntegerType
other custom mapping, depends on definition NativeMapped

4. 经验总结默认映射关系

尽管 JNA 官方已经提供了详细的类型映射文档。但在实际中发现按照官方映射可能出现莫名问题。对此我们在实际开发中对于一些类型的映射报错,可以参考以下映射做出调整。

C类型 JNA类型 说明
char * out Pointer Pointer room = new Memory(30);
uchar * out Pointer Pointer room = new Memory(30);
long * long [ ]
int * init [ ]
int int
char * byte [ ]
char * argv[] String []
uchar int
long NativeLong 兼容 32和64位

5. 常见错误

1. UnsatisfiedLinkError 问题

存在多个动态链接库之间调用情况,可能缺少其中某一个动态链接库文件。

2. Error Memory Access 问题

较大情况下存在参数类型映射错误,参考 JNA 类型映射。

3. dll can not find in win32/86

无法加载到动态链接库文件路径,需要将动态链接库放到项目根目录下,推荐开启 JNA 驱动加载 debug 模式,

System.setProperty("jna.debug_load", "true"); 

手动指定动态链接库文件路径

System.setProperty("jna.library.path",dllResourcePath);
System.setProperty("jna.platform.library.path",dllResourcePath);

4. 程序在运行一段时间后崩溃

在JNA crash-protection 中,官方文档说明的崩溃的主要原因,( These are often caused by improper mappings or invalid arguments passed to the native library.) 未知的参数类型映射导致vm崩溃。在很大程度上使用 Pointer 来作为 Java 通用映射类型。
而 JNA 默认程序保护Native.setProtected(true)使得 java 错误来代替程序崩溃,可以设置 Native.setProtected(false) 来 dump 出崩溃日志。

问题可以反馈到 JNA Google Group : https://groups.google.com/forum/#!forum/jna-users

6. 参考

  1. JNA Google Group : https://groups.google.com/forum/#!forum/jna-users
  2. JNA API Documentation: https://java-native-access.github.io/jna/4.2.1/overview-summary.html
  3. JNA VM Crashed Protection :http://java-native-access.github.io/jna/4.5.1/javadoc/overview-summary.html#crash-protection

原文来自:https://iliangqunru.bitcron.com/post/2018/jna-shi-ji-kai-fa-zhong-ruo-gan-wen-ti-jie-jue-fang-fa

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaWeb 创建省市级关联菜单
JavaWeb 创建省市级关联菜单
23 0
《JavaScript开发框架权威指南》——导读
JavaScript社区中正在迈开近乎狂热的创新步伐,虽然充满了无穷的魅力,但也提出了自己的独特的挑战。JavaScript的生态系统包括库、框架以及工具,都在剧烈地成长。过去针对任何给定问题可能只有少量的解决方案,而今已经有许多解决方案可以选择,并且其数目日益增长。
1844 0
《HTML5和JavaScript Web应用开发》——2.2 决定支持
Mobile Safari(iOS6):Apple对早期HTML5规范的应用和实现令人印象深刻,该公司明显成为推动Web前进的动力。利用标准的硬件和多核技术,iPhone和iPad已经成为杰出的HTML5开发平台。
1867 0
JavaWeb 创建省市级关联菜单
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/48828973 JavaWeb 创建省市级关联菜单。
732 0
JavaScript使用自定义事件实现简单的模块化开发
原文:JavaScript使用自定义事件实现简单的模块化开发   WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件; 焦点事件; 鼠标事件; 滚轮事件; 文本事件; 键盘事件; 变动事件;   现在网页上有一个输入框, 如果我们...
865 0
Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程
1. Nginx 介绍        Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,从2004年开始它已经在该站点运行了七八年了。
760 0
Node.js / JavaScript后端开发指引
这是一篇关于后端 JavaScript 开发的指引,如果你对 JavaScript 的认识仍然停留在前端开发的话,你需要更新自己的知识体系了。 用 NPM 来做项目管理和包维护 用 Grunt 来做代码格式修整、Lint 和其他自动化任务 用 CoffeeScript 方言写更友好的 Ja...
1863 0
新书出版:Java Web开发速学宝典
本文为原创,如需转载,请注明作者和出处,谢谢! Java Web开发速学宝典 定购china-pub当当网 北京新华书店市场价 : ¥59.
643 0
+关注
helixcs
do better
5
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载