在应用本地调用其它程序或存在硬件时,硬件提供二次开发接口时,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 #endif10 /*11 * Class: com_xqrj_liberary_UsbKeyHelper12 * Method: isUkExist13 * Signature: ([B)Z14 */15 JNIEXPORT jboolean JNICALL Java_com_xqrj_liberary_UsbKeyHelper_isUkExist16 (JNIEnv *, jclass, jbyteArray);17 18 /*19 * Class: com_xqrj_liberary_UsbKeyHelper20 * Method: getUkData21 * Signature: ([B)[B22 */23 JNIEXPORT jbyteArray JNICALL Java_com_xqrj_liberary_UsbKeyHelper_getUkData24 (JNIEnv *, jclass, jbyteArray);25 26 #ifdef __cplusplus27 }28 #endif29 #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