Java-JNA使用心得
自上个月20号,历时整整一个月,终于找到工作入职了。
然后这段时间一直看公司的框架还有业务方面的东西。其实由于给分配了一个研究Java调用C语言接口的问题,导致框架业务方面的东西还不熟,然后现在手上又有了一个需求要15号前做出来,感觉有点压力啊。虽然说是和之前某个需求差不多,修修改改就能出来,但是这样的话有点和我准备好再做事的性格冲突了。废话说了一堆,就当是吐槽吧,这段时间都没能好好看之前看到Java书籍了,这样不行啊!!!
五一之前几天,组里领导突然让我研究下关于Java调用C语言的问题,当时我是懵了的,毕竟算是公司新人而且还是行业新人,这个任务感觉有点突然。不过毕竟是领导说的,我总不能说不行吧,所以我就应承下来了。之后我就网上各种搜索了。刚开始看到的说的都是JNI(java native interface),看了看感觉还行啊不是很难,然后就模仿写了一个小demo。具体代码就不贴了,比较简单,就贴一个之前看的博客地址。JAVA中调用C语言接口
本来在公司写过一个小文档了,然而公司的保密政策让我也不确定把我自己写的文档发我自己邮箱会不会违规......所以干脆就这样吧
之前完成这个后,兴奋的把小文档发给了领导,没想到之后就收到一个更大的任务,要让我用Java实现去调用一个C语言编写的SDK。那SDK函数都几十个的感觉,虽然后来给精简了下,留下不可缺少的9个函数和1个37个变量还是40+变量的结构体以及几个静态常量。
当时的我内心其实是崩溃的,因为在学习JNI的时候就发现其实处理指针和结构体是挺麻烦的...所以当时收到任务时,我也是先应承了下来,之后就又继续搜索,最后给我发现了JNA开源类库,官方github地址JNA。说是sun公司提供的建立在JNI之上的类库。
之后经过一阵学习踩坑后,还是如期的完成的了任务。依然还是公司的保密政策,所以之前在公司写的几个坑只能先按印象写了。
1、Native.loadLibrary("msvcrt", CLibrary.class);其中msvcrt是要加载的dll文件,这个文件一般是放在windows下的system32文件夹下,或者是jdk文件夹里的bin文件夹下面。但是前面两个都比较麻烦,所以这个dll也可以加上路径名,比如“C:\\msvcrt”。
2、当遇到C语言里面的方法有被“__stdcall”修饰的,那么就要写成public interface Kernel32 extends StdCallLibrary{}而不是public interface Kernel32 extends Library{},否则据说会遇到崩溃。
3、在做Java调用SDK的工程时分成了4个文件,一个是专门放映射静态常量的,一个是专门放映射结构体的,一个是专门放映射方法的,一个是测试类。
4、通过JNA传递数值时,最大的问题就是数据类型的转换。比如C里面的long,unsign long,int都能用Java里的int映射,这里有个官方的映射表Default Type Mappings,个人觉得,C里面的char*用Java里面的byte[]来映射比较好,因为SDK任务里面,用String出错了,byte[]就没问题。另外还有一点需要注意的是,C和Java之间的传值,应该是不支持二维数组的,或者说是不能直接用二维数组的,就是说不能用Java里面的byte[][]来映射C里面的char[][]。其解决方式是用间接的二维数组来映射。比如说C里面有个char[][]需要映射,则Java里面对应的是erweishuzu[],而erweisuzu的定义其实就是byte[]。
5、在运行测试类时,如果出现不能加载路径正确且存在的dll文件,那么有可能是没有把所有依赖的dll放在一起,可以同depend.exe查看dll文件所依赖的其它dll文件,放在一起后一般就能加载了。
暂时应该就是这些,其它的想到了再补充!
Java-JNA使用心得的更多相关文章
- Java开发学习心得(二):Mybatis和Url路由
目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...
- Java开发学习心得(一):SSM环境搭建
目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...
- Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27
Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...
- Atitit.java jna 调用c++ dll 的总结
Atitit.java jna 调用c++ dll 的总结 1. JNA技术解密1 1.1. JNA工作原理1 2. JNA技术难点 Java—C和操作系统数据类型的对应表1 2.1. 1 2.2. ...
- java集合类学习心得
java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...
- Java JNA (五)—— 释放Memory对象分配的内存
Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...
- Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例
ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...
- Java JNA (三)—— 结构体使用及简单示例
JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...
- Java JNA (二)—— dll回调函数实现
java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...
- Java JNA (一)—— 调用dll
Java调用C++动态链接库的方式很多,有jnative,jna等.这里介绍如何通过jna的方式调用动态链接库. 调用代码很简单,就是需要注意几个问题. 补充:如dll内部访问配置文件,需将配置文件放 ...
随机推荐
- senium
http://webdriver.googlecode.com 所以CTRL属于Modifier Key,需要这样写: Actions actionObject = new Actions(drive ...
- 我的ORM框架
任何系统的基础,都可以算是各种数据的增删改查(CRUD).最早操作数据是直接在代码里写SQL语句,后来出现了各种ORM框架.C#下的ORM框架有很多,如微软自己的Entity Framework.第三 ...
- AFNetworking 使用总结 (用法+JSON解析
AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其他方法为基础的. 下面这个例子是用来处理json请求的: NSURL *url = ...
- Python动态类型简单介绍
动态类型以及它提供的多态性,无疑是Python语言简洁性和灵活性的基础. 一.变量 <1>变量创建 一个变量a.当代码第一次给它赋值时就创建了它,之后的赋值将会改变已创建的变量名的值. ...
- 文本编辑器Vim技巧
1. 导入文件内容 :r 文件名 2. 插入当前日期 :r !date 3. :!which ls 4. :r !命令
- BOM编程
1 BOM编程 1.1 入门 BOM就是浏览器对象模型编程,通过javascript引擎提供的四个浏览器对象,操作浏览器,这叫BOM编程 1.2 window对象(重点) window代表的是一个窗口 ...
- 【洛谷P1962】斐波那契数列
斐波那契数列 题目链接:https://www.luogu.org/problemnew/show/P1962 矩阵A 1,1 1,0 用A^k即可求出feb(k). 矩阵快速幂 #include&l ...
- 安装ubuntu-tweak
第一步:添加tweak源 sudo add-apt-repository ppa:tualatrix/ppa 第二步:更新 sudo apt-get update 第三步:安装ubuntu-t ...
- A Multigrid Tutorial中涉及到的难点词汇
Multigrid Tutorial中涉及的词汇: Elliptic PDEs 椭圆型偏微分方程 Lawrence Livermore National Laboratory 劳伦斯利福摩尔国家实验室 ...
- js 实现链表
我们通常会在c++这类语言中学习到链表的概念,但是在js中由于我们可以动态的扩充数组,加之有丰富的原生api.我们通常并不需要实现链表结构.由于突发奇想,我打算用js实现一下: 首先我们要创建链表: ...