自上个月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. Spring Boot项目Circular view path问题解决

    使用Spring Boot创建Spring MVC项目,访问url请求出现问题:Circular view path 1.问题描述 控制台打印: javax.servlet.ServletExcept ...

  2. 从HTTP响应头判断是否命中CDN

    腾讯云: X-Cache-Lookup:Hit From MemCache 表示命中CDN节点的内存X-Cache-Lookup:Hit From Disktank 表示命中CDN节点的磁盘X-Cac ...

  3. gcc编译流程

    gcc的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 以hello.c为例子,在这四个步骤中 ...

  4. BZOJ 4679/Hdu5331 Simple Problem LCT or 树链剖分

    4679: Hdu5331 Simple Problem 题意: 考场上,看到这道题就让我想起BZOJ4712洪水.然后思路就被带着飞起了,完全没去考虑一条链的情况,于是GG. 解法:先考虑一条链的做 ...

  5. C语言中的特殊变量

    auto: 函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间. register: 为了提高效率,C语言允许 ...

  6. Javascript作业—取字符串的第一个只出现一次的字母

    js作业 取字符串第一个只出现一次的字母 <script type='text/javascript'> //取a-z字符串中第一个只出现一次的字母 function firstUniqu ...

  7. AFNetworking 初探

    AFNetworking 初探 繼ASIHTTPRequest發佈不再維護的訊息之後,如果我們不使用CDN(雲端伺服器),AFNetworking 會是一套不錯的選擇.下載網址:https://git ...

  8. python图形库(1)

    python有很好图形库cv2(包含很多图形处理的算法),pylab(绘图工具模块) 这两个“模块”是肯定要配置的. 安装这两个模块可用了我不少时间. pylab它不是一个包,而是 numpy, sc ...

  9. 2017.11.7 JavaWeb------Servlet过滤器

    JavaWeb------Servlet过滤器 (1)过滤器是web服务器上的组件,它们对客户和资源之间的请求和响应进行过滤.Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响 ...

  10. cuda数组的拷贝

    原文链接 简单描述一下自己要做的事情:(1)CPU三维的vector--->(2)CPU三维数组--->(3)转换到GPU中的三维数组--->(4)转换到CPU中的三维数组,而其中问 ...