自上个月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. [转]linux tcp/ip调优

    LINUX tcp/ip性能调优 On 2011年03月15日, in linux, tips, by netoearth 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接 ...

  2. 微信小程序之性能优化

    如果做前端仅仅停留在编码和实现业务功能上面,可能进步速度会有些慢,但是如果经历了对页面的性能优化之后而且有所成绩的话那就不同了,因为你对他背后的机制进行了研究,才能做好性能优化. 做微信小程序也是一样 ...

  3. sublime text2卸载和重新安装(转载)

    很多同学使用 sublime text2 的时候,出现一些奇怪的bug,且重启无法修复. 于是,就会想到卸载 sublime text2 再重新安装. 然而,你会发现,重新安装后,这个bug任然存在, ...

  4. UVA-674 Coin Change---完全背包

    题目链接: https://vjudge.net/problem/UVA-674 题目大意: 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 思路: 每 ...

  5. HTTP 下载文件工具类

    ResponseUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.File; im ...

  6. 卷积神经网络CNN理解

    自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet.cuda-convnet2. ...

  7. caffe中的sgd,与激活函数(activation function)

    caffe中activation function的形式,直接决定了其训练速度以及SGD的求解. 在caffe中,不同的activation function对应的sgd的方式是不同的,因此,在配置文 ...

  8. orale 10g和11g中的自动统计任务

    orale 10g和11g中的自动统计任务 博客分类:  数据库相关/oracle   1)  先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Or ...

  9. 使用 W3C Performance 对象通过 R 和 JavaScript 将浏览器内的性能数据可视化[转]

    当考虑 Web 性能指标时,需要关注的目标数字应该是从您自己的用户那里获得的实际用户指标.最常见的方法是利用 Splunk 之类的工具来分析您的机器数据,该工具支持您分析和可视化您的访问权限和错误日志 ...

  10. margin与padding大比拼

    用margin还是用padding这个问题相信是每个学css的人都想要去深入了解的. CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距 ...