自上个月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使用心得的更多相关文章

  1. Java开发学习心得(二):Mybatis和Url路由

    目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...

  2. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  3. 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)需 ...

  4. 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.  ...

  5. java集合类学习心得

    java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...

  6. Java JNA (五)—— 释放Memory对象分配的内存

    Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...

  7. Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例

    ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...

  8. Java JNA (三)—— 结构体使用及简单示例

    JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...

  9. Java JNA (二)—— dll回调函数实现

    java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...

  10. Java JNA (一)—— 调用dll

    Java调用C++动态链接库的方式很多,有jnative,jna等.这里介绍如何通过jna的方式调用动态链接库. 调用代码很简单,就是需要注意几个问题. 补充:如dll内部访问配置文件,需将配置文件放 ...

随机推荐

  1. IDEA导入Web项目

    最近尝试着从eclipse.myeclipse转到idea上面来开发. *注:以下仅适用于普通web项目.*  一.导入已有项目 File>Open...>选取自己的项目位置 二.添加ja ...

  2. JS兼用IE8的通过class名获取CSS对象组

    转自:Garon_InE 原生js方法“document.getElementsByClassName”在ie8及其以下浏览器中不能使用,所以写了一个兼容IE的方法. 完整的页面代码如下: testJ ...

  3. Can't connect to any repository.Read timed out after 30,000 ms

    解决方法:

  4. 计算后缀表达式的过程(C#)

    计算后缀表达式的过程是一个很好玩的过程,而且很简单哦!这里呢,有个计算的技巧,就是:遇到数字直接入栈,遇到运算符就计算! 后缀表达式也叫逆波兰表达式,求值过程可以用到栈来辅助存储: 假定待求值的后缀表 ...

  5. Simotion应用案例,使用Simotion web server调试,使用Project Generator创建项目,Simosim模拟运行运行项目

    Simotion web server simotion项目设计和调试过程中,web server功能越来越常用.例如Project generator生成的FBAxis, winder, print ...

  6. java研发常见问题总结2

    1. String.StringBuffer与StringBuilder之间区别 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 ...

  7. iOS开发:小技巧积累2

    http://blog.sina.com.cn/s/articlelist_1935098904_1_1.html .获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(My ...

  8. Linux操作系统下的三种Java环境配置方法

    方法1:修改/etc/profile 文件  所有用户的 shell都有权使用这些环境变量 (1)在 shell终端执行命令:vi /etc/profile (2)在 profile文件末尾加入: e ...

  9. Linux---who命令学习

    who命令 获取正在登录系统的用户 使用Linux的who命令 第一个参数book代表用户名,第二个参数tty7代表终端名,第三个参数代表时间,第四个参数代表用户的登录地址. 阅读手册 使用命令读手册 ...

  10. LeetCode(Two Sum)

    一.题目要求 Given an array of integers, return indices of the two numbers such that they add up to a spec ...