JNI调用DLL实例

在应用本地调用其它程序或存在硬件时,硬件提供二次开发接口时,JAVA调用其接口时需要通过JNI进行进行接口开发

JAVA与C或C++进行数据交换,以下程序为服务器端需判断USBKEY是否存在,USBKEY厂商提供开发及调用接口,但JAVA调用不是很方便,特需要用VC++进行进一步封装

接口由JAVA进行定义,并生成头文件,如下代码

UsbKeyHelper助手类,调用VC++的方法都在其中,包括加载VC++生成的动态库

 1 package com.xqrj.liberary;
2
3 public class UsbKeyHelper {
4 static {
5 try {
6 //获取并输出库的路径
7 System.out.println(System.getProperties().get("java.library.path"));
8 //加载本地库文件,不需要写扩展名
9 System.loadLibrary("Uskkey");
10 } catch(UnsatisfiedLinkError e) {
11 e.printStackTrace();
12 System.err.println( "Cannot load library:\n " + e.toString() );
13 }
14 }
15 /**
16 * 检测UK是否存在
17 * @param data UK类型
18 * @return boolean(false:不存在,true:存在)
19 */
20 public native static boolean isUkExist(byte[] data);
21 /**
22 * 获取UK数据
23 * @return byte[]
24 */
25 public native static synchronized byte[] getUkData(byte[] data);
26 }

利用javac对JNI助手类进行编译

利用javah对class产生.h头文件

com_xqrj_liberary_UsbKeyHelper.h JAVA以定义的方法生成的头文件

 1 /* DO NOT EDIT THIS FILE - it is machine generated */
2 #include <jni.h>
3 /* Header for class com_xqrj_liberary_UsbKeyHelper */
4
5 #ifndef _Included_com_xqrj_liberary_UsbKeyHelper
6 #define _Included_com_xqrj_liberary_UsbKeyHelper
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: com_xqrj_liberary_UsbKeyHelper
12 * Method: isUkExist
13 * Signature: ([B)Z
14 */
15 JNIEXPORT jboolean JNICALL Java_com_xqrj_liberary_UsbKeyHelper_isUkExist
16 (JNIEnv *, jclass, jbyteArray);
17
18 /*
19 * Class: com_xqrj_liberary_UsbKeyHelper
20 * Method: getUkData
21 * Signature: ([B)[B
22 */
23 JNIEXPORT jbyteArray JNICALL Java_com_xqrj_liberary_UsbKeyHelper_getUkData
24 (JNIEnv *, jclass, jbyteArray);
25
26 #ifdef __cplusplus
27 }
28 #endif
29 #endif

此头文件可以在VC中引用,可以对DLL进行进一步封装,VC生成的动态库名称应为"Uskkey.dll"

并将此动态库放到系统system32下或指定的"System.getProperties().get("java.library.path")"输出的目录下

JniTest JNI测试程序

 1 package com.xqrj.liberary;
2
3 public class JniTest {
4 public static void main(String[] args) {
5 try {
6 //调用动态库判断UK是否存在
7 if (!UsbKeyHelper.isUkExist(null)) {
8 throw new Exception("USBKEY不存在!");
9 }
10 byte[] buff = UsbKeyHelper.getUkData(null);
11 System.out.println("获取到的USBKEY数据:"+new String(buff));
12 } catch(Exception e) {
13 e.printStackTrace();
14 }
15 }
16 }

JNI调用DLL实例完成,此例未生成DLL也未经过测试,所以不提供源程序代码了,呵

转载于:https://www.cnblogs.com/ynjxxk/archive/2012/04/06/2434634.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值