记得以前 Java 要调用C/C++写得动态库都是用的 JNI 方式,还需要自己写不少 C/C++ 代码。比如说要在Java中调用已有的动态库,如 Windows 的 user32.dll 的方法 MessageBoxA,具体步骤是 Java 中声明一个 native 方法,然后用 javah 命令生成JNI样式的头文件,再自己实现头文件中声明的方法,在实现方法中装载动态库 user32.dll,调用 MessageBoxA 方法,需要把自己写的这部分 C/C++ 代码封装成一个动态库,如Sample.dll,最后在 java  中装载 Sample.dll,然后执行其中所声明的本地方法。

可见,用老实的JNI方式,我们在调用一个已知动态库的时候还需要额外生成一个符合JNI规则的动态库作为桥梁,显得有点多余了。

下面我将引入一个开源的组件 JNative,在 http://sourceforge.net/projects/jnative 下载(我是通过在sourceforge中输入java dll搜索到的),通过它调用已有动态库中的方法就非常的方便,因为中间的JNI处理过程它都为我们做好了。JNative 现在还是 1.4 版,期待正式版的出炉,还不知道这个版本将会有什么Bug出现。

我们下载到的 jnative 的目录中可以看到三个文件,分别是 JNative.dll,libjnative.so,JNative.jar

JNative.dll  为 Windows 平台下用的,可以拷到相应的lib加载路径,如user.dir、path、system32或windows目录下
libnative.so 为Linux平台下用的,可以拷到相应的lib加载路径,如user.dir、path目录下
JNative.jar 这个就是我们编程时候要用的

在下载的 jnatidve 的源代码中有示例代码,观看代码 org/xvolks/test/JNativeTester.java 就知道 jnative 是如何调用动态库方法的

如代码行 User32.messageBox(0, "Demonstrates JNative in action with many Win32 calls", "Welcome to JNative", 0);

是调用的关User32的messageBox方法,而messageBox的代码是

  1. public static final int messageBox(int parentHandle, String message,
  2. String caption, int buttons)
  3. throws NativeException, IllegalAccessException {
  4. JNative n = null;
  5. try {
  6. n = new JNative(DLL_NAME, "MessageBoxA"); // 常量DLL_NAME的值为User32.dll
  7. // 构造JNative时完成装载User32.dll,并且定位MessageBoxA方法
  8. n.setRetVal(Type.INT); // 指定返回参数的类型
  9. int i = 0;
  10. n.setParameter(i++, Type.INT, "" + parentHandle);
  11. n.setParameter(i++, Type.STRING, message);
  12. n.setParameter(i++, Type.STRING, caption);
  13. n.setParameter(i++, Type.INT, "" + buttons); // 指定位置上的参数类型和值
  14. n.invoke(); // 调用方法
  15. return Integer.parseInt(n.getRetVal());
  16. } finally {
  17. if (n != null)
  18. n.dispose(); // 记得释放
  19. }
  20. }

上面的注释是我加上去的。

Type有一种叫做Type.PSTRUCT枚举值,对C/C++中结构的处理都考虑到了,只要用JNative的Pointer类的实例来与结构对应就行了。org/xvolks/test/SNDPTester.java中演示了如何传递C/C++中的结构相对应的Java数据类型,也就是怎么封装成一个JNative的Pointer类型。

还有在JNative中用了JDK1.5的一些特性,如枚举、静态引入等,所以在JDK1.4下是不能用的。

转载:http://blog.csdn.net/hangke/article/details/2697518

Java调用动态库(转载)相关推荐

  1. 利用JNative实现Java调用动态库

    由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 "Java dll",首先出现的是 ...

  2. Java调用动态库 缺点,Java调用动态库所需要关心的有关问题

    Java调用动态库所需要关心的问题 标签: 无标签 利用JNative实现Java调用动态库(转) http://cctv663.blog.163.com/blog/static/1011921220 ...

  3. java 调用动态库打包sdk

    java连接c++动态库并生成jar包提供给别人调用 1.需要将java通过jni生成头文件,并导入到c++项目并对c++进行jni方法继承 在项目的src目录执行,否则会提示 错误:找不到符号 ja ...

  4. Java调用动态库 缺点_java调用动态库(dll)的一些问题

    javac 1)dos切换到java文件所在目录,使用javac编译出class文件 javah的一些问题: 1)切换到src目录下 2)设置路径命令:set classpath=src目录的完全路径 ...

  5. linux用c++调用动态库

    1.3 用c++静态方式调用动态库libsthc.so: /*cpptest.cc*/    //linux下的c++后缀有cc,cxx, cpp #include "libsthc.h&q ...

  6. 动态调用动态库方法 .so

    2019独角兽企业重金招聘Python工程师标准>>> 关于动态调用动态库方法说明 一.       动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以 ...

  7. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  8. 【C 语言】动态库封装与设计 ( Windows 动态库简介 | Visual Studio 调用动态库 )

    文章目录 一.Windows 动态库简介 二.Visual Studio 调用动态库 一.Windows 动态库简介 在 C:\Windows\System32 目录中 , 存放着 Windows 中 ...

  9. C#.net调用动态库dll注意事项

    C#.net调用动态库dll注意事项 本文主要描述作者在工作中所遇到技术难点及问题,最后提出相关的解决方案 场景 公司有个业务需求涉及到ID读卡器,构建成在ID卡读卡器一刷ID卡,系统就自动显示其ID ...

最新文章

  1. 普通话测试第四题评分标准_普通话考试中命题说话的扣分标准
  2. 前端工程打开速度优化的循序渐进总结
  3. select模型使用例子
  4. python判断是否为素数_python判断是否为素数
  5. Linux系统ftp服务器搭建
  6. Canoe-14229-UDS自动化测试脚本CAPL 这适用于CANoe无diva的测试脚本
  7. 基于Springboot的个人健康监控管理系统
  8. [后端开发]支付宝支付接口调试 (Python v3.6)
  9. 最新版WIN10安装教程(官方纯净版)(适用于新机以及旧机重装系统或升级系统)
  10. 含并行连结的网络(GoogLeNet)
  11. spring boot网上购物系统毕业设计源码311236
  12. 用python画哆啦a梦的头_用 Python 画个哆啦A梦
  13. 思科路由器学习初步基础--- CCNA入门
  14. mysql实践周心得_实践周心得体会4篇
  15. PMML模型-评分卡模型Undefined result解析
  16. PWM整流器仿真模型,SVPWM调制方式,空间矢量调制,仿真模型。 PWM整流器matlab仿真模型,SVPWM调制
  17. 【C++】细说C语言头文件的路径
  18. 学python还是scratch_我们的孩子该学习Scratch还是Python?
  19. 合同诈骗案立案标准是怎样的
  20. 如何主动学习?IT从业者的学习秘籍

热门文章

  1. 【赠书】深入浅出embedding:原理解析与应用实践
  2. 【GAN优化】如何选好正则项让你的GAN收敛
  3. 【图像分类】 基于Pytorch的细粒度图像分类实战
  4. 全球及中国蔬菜泥配料行业竞争策略及投资潜力研究报告2021-2027年版
  5. oracle语句怎么倒退,oracle RETURNING 子句使用方法
  6. C++ Primer Plus章节编程练习(第五章)
  7. mzy,struts学习(一)
  8. Jumping Jack
  9. js 导出到excel
  10. iOS自动偏移64个像素