首页 > Java调用动态库(转载)

Java调用动态库(转载)

记得以前 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

更多相关:

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...