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内部访问配置文件,需将配置文件放 ...
随机推荐
- selenium googleDrive
http://chromedriver.storage.googleapis.com/index.html?path=2.1/下载地址 把googledriver.exe 放到google浏览器下目录 ...
- 笨办法学Python(二十七)
习题 27: 记住逻辑关系 到此为止你已经学会了读写文件,命令行处理,以及很多 Python 数学运算功能.今天,你将要开始学习逻辑了.你要学习的不是研究院里的高深逻辑理论,只是程序员每天都用到的让程 ...
- ODBC驱动程序丢失解决方法
今天运行SqlDbx连接数据库的时候报错,提示没有找到相应的ODBC driver,打开ODBC管理面板一看,发现里面的驱动程序都不见了.这时想起今天卸载了一个成本核算软件后成这样的,网上搜索一下只需 ...
- *205. Isomorphic Strings (string & map idea)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- IOS TableView代理设置 table的行高
// 设置行高(每一行的高度一致) self.tableView.rowHeight = ; self.tableView.delegate = self; #pragma mark - 代理方法 / ...
- bzoj1801 [Ahoi2009]中国象棋
Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...
- Android开发之动态创建多个按钮
//获取屏幕大小,以合理设定 按钮 大小及位置 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDispl ...
- JS浏览器的三种弹框:
1.alert:使用alert弹框提示信息,最后都会被转化为字符串输出(因为调用了toString这个方法).比如alert(1+1)弹出的结果应该是字符串形式的“2”. 2.Confirm:在ale ...
- LeetCode47.Permutations II(剑指offer38-1)
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- Python——字典
字典是一种key-value 的 数据类型,使用就想我们上学用的字典.可以通过笔画,字母来查对应页的详细内容. 特性:1. 字典是无须的.(如果光打印字典里的字符串,那么排序不会按照顺序排,因为字典是 ...