首先是背景:
1.程序猿小明要使用Java程序来调用IC读卡器,由于Java没有相关方法直接调用读卡器,目前只有C或C++语言能调用读卡器的驱动来控制读卡器,因此得先使用C或C++写完操作函数,封装成dll的形式供Java调用。但是直接使用C++生成的DLLJava并不能调用,所以得通过jni。

要怎么做呢?
1.第一步不是直接写dll然后生成dll然后再写Java类直接调用!!!这跟C++使用动态链接库是有区别的!
2.那第一步不写DLL那是干嘛呢?那肯定是写Java类了!首先是规划好并写一个Java类,要生成一个Java可以使用的DLL必须由这个Java类来生成。这个Java类这个类负责调用DLL,也就是调用这个类里边的方法就可以调动读卡器。特别需要注意的是什么呢,生成的Java的DLL也不像C++的DLL一样,谁都可以使用,由一个JAVA类生成的DLL只有这个Java类才可以调用这个DLL!
3.至于第二步为什么使用“规划”这个词也是以上的原因,因为一旦DLL生成了以后呢,如果到时候你觉得可以调用读卡器的这个类的包名起的不好、或者说类名取得不好,或者是里边关于调用读卡器的方法名取得不好,你想改一改这些名称,对不起,这个类已经跟DLL绑定在一起了,只有这个类才可以调用DLL,要是这个类有变动,那么它就不能调用这个DLL了!那生成的DLL就废了,只能重新做另外一个DLL。
4.所以说这个类很重要,那这个类怎么写呢?既然是一个Java类,那大体还是跟普通的Java类是一致的。如以下:

5.生成类以后那肯定是编译了,假设该类为ABC.java,使用javac命令把这个类编译成ABC.class文件。
6.生成ABC.class文件以后,使用javah命令处理这个ABC.class文件,javah也是jdk自带的工具,也放在jdk的bin目录下,处理这个ABC.class文件了会生成ABC.h文件。这个ABC.h文件就是生成DLL的关键了,接下来的步骤跟使用C++写DLL就比较像了,注意这个ABC.h文件里边记载了ABC.java的方法声明,还有包路径信息。所以说DLL和这个类绑定在了一起。不能谁都使用。大致如下:

7.接着就是C++编写动态链接库的方式了,首先通过vs创建一个DLL工程,DLL工程的项目名就是DLL的名了(可以跟ABC不一样,上面说的好像不一样也可以,现在把“好像”去掉),头文件就不用写了,因为上边已经生成了ABC.h头文件,直接引入即可,同时还需要导入两个头文件,jin.h和jni_md.h。这两个文件都在jdk中的include文件夹下,把它们复制到项目中。

8.既然头文件搞好了,那就开始写cpp文件了,具体的就跟c++写函数实现一样了,就实现在ABC.h中声明的那些函数即可。也就是操作读卡器的代码。

9.写完后就可以生成了,生成成功后会在DLL底下生成DLL文件,把DLL放在你的JAVA项目下,就可以通过调用ABC.java的方法来操作读卡器咯。至于放到项目的哪里,应该都可以吧,如果使用eclipse等开发工具,可以配置库的位置,如果不用任何开发工具,最好放在最外层的包相同等级的文件夹下吧,或者放在jdk的库里边,反正到时候运行报错了会有提示说在xxx;vvv;bbb;找不到库,只要把这个dll放在这些其中任意一个地方就好了。

纯属个人理解,如有错误,欢迎指正!

学习资料来源:
Java通过JNI调用C++的DLL文件

Java调用第三方dll

这是一个完整的小demo

关于JAVA调用dll的学习总结相关推荐

  1. java 调用win32 api 学习总结

    java使用JInvoke调用windows API 使用jinvoke调用windowsAPI.jna使用比较麻烦,需要写c代码和参数转换,jinvoke的使用就像jdk中的包一样. 官网使用参考: ...

  2. 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。

    关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...

  3. Java 调用Dll

    Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样. 这个程序是java中调用dll中的求和函数. 一,java代码部分操作 1.新建pr ...

  4. 关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat

    关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat 参考文章: (1)关于j ...

  5. java dll 调用方法_关于Java调用dll的方法 | 学步园

    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C   写好的DLL库时,由于基本数据类型不同.使用字节 ...

  6. java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定 | 学步园

    终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖 ...

  7. java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定

    终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖 ...

  8. java 多线程 调用 dll 出错,JAVA调用DLL异常,请高手寻找异常原因,给出解决方法...

    当前位置:我的异常网» J2SE » JAVA调用DLL异常,请高手寻找异常原因,给出解决方法 JAVA调用DLL异常,请高手寻找异常原因,给出解决方法 www.myexceptions.net  网 ...

  9. Java 调用 C++ (Java 调用 dll)康哥手把手教你

    摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ...

最新文章

  1. python 面向对象:类,作用域
  2. C++和Python的交互
  3. JupyterNotebook随记(part2)--更改JupyterNotebook主题
  4. X-Mas Musings –在Grails集成测试中不要使用随机服务器端口
  5. MySQL 日志文件 说明
  6. 虚拟机系列 | 执行引擎和垃圾回收
  7. flask 重定向(redirect)和会话(session)
  8. 搭建Windows SVN服务器及TortoiseSVN使用帮助和下载
  9. 是运用计算机科学的基础知识进行问题求解,计算机基础-第一章计算机基础知识.ppt...
  10. 三年经验前端vue面试记录
  11. 解决edge浏览器中idm插件不能自动捕捉下载链接的问题
  12. Linux(六)NFS(network file system)服务器实验
  13. 蓝桥杯攻略大全 | 学习路线 | 注意事项
  14. 第三周助教工作总结——NWNU李泓毅
  15. “毒液” 高危漏洞背后的技术较量
  16. 汽车维修行业开发微信小程序的必要性
  17. 【Google Chrome】如何让浏览器显示手机网页
  18. 胸怀——勇气——智慧
  19. 我的科幻杂谈1:不读史,无以言
  20. Lora无线模块在畜牧业中的应用

热门文章

  1. shell之字体颜色显示
  2. ssh客户端使用及下载
  3. “tel.xls.exe病毒”解决方法
  4. 防止网站内容被人小偷和采集的ASP代码
  5. JS关于提交的RSA加密算法
  6. SDN的实现方式及局限性—Vecloud微云
  7. 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
  8. OC第八节 内存管理高级
  9. 八条是阿里6万工程师正在重点攻克的难关
  10. Matlab绘图详细总结