双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

[原创]JNI调用指纹仪接口示例

langke93 langke93 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
首先国际惯例,先说明概念
什么是Native Method
简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
"A native method is a Java method whose implementation is provided by non-java code."
在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。下面就是一个中控指纹仪比对的接口:

package com.yujie.util;

public class MatchClassLoader {
//比对指纹模板本地接口,ARegTemplate是登记模板,AVerTemplate是比对模板,比对成功返回True,失败返回False。
public native boolean process(String ARegTemplate, String AVerTemplate);


public MatchClassLoader(){}
static{
//System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("matchload");//把Match.dll复制到tomcat_home/bin
}
//使用单例模式,注意这是private 只供内部调用
private static MatchClassLoader instance = new MatchClassLoader();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static MatchClassLoader getInstance() {
return instance;
}
/**
* 比对方法
* @param reg
* @param ver
* @return
*/
public static boolean match(String reg,String ver){
if(reg==null || ver ==null){
return false;
}else if(reg.indexOf("/////")!=-1 || ver.indexOf("/////")!=-1){
//System.out.println("不能有转义符");
//return false;
}
return MatchClassLoader.getInstance().process(reg,ver);
}
}



上面这个接口要把Match.dll复制到JAVA_HOME/bin目录下
然后就开始编译接口,并用javah生成C的接口
javac com.yujie.util.MatchClassLoader.java
javah -jni com.yujie.util.MatchClassLoader
好了,接下来就是写C程序了,我是用Mingw的gcc来编译的
下载地址http://sourceforge.net/projects/mingw/
下载装完后配置几个环境变量就可以用啦:
PATH d:\MinGW\bin;
LIBRARY_PATH d:\MinGW\lib
C_INCLUDEDE_PATH d:\MinGW\include
CPLUS_INCLUDE_PATH d:\MinGW\include\c++\3.4.2;d:\MinGW\include\c++\3.4.2\mingw32;d:\MinGW\include\c++\3.4.2\backward;d:\MinGW\include

现在写个matchload.c实现刚才生成.h文件的方法,重点就是在这里了,这个C程序必须实现调用DLL并返回执行结果,里面涉及Java跟C的数据类型转换,和字符串转换

#include <jni.h>
#include "com_yujie_util_MatchClassLoader.h"
#include<stdio.h>
#include <windows.h>
#include <string.h>

JNIEXPORT jboolean JNICALL Java_com_yujie_util_MatchClassLoader_process
(JNIEnv * env, jobject obj, jstring str1, jstring str2){
//printf("Hello Java_com_yujie_util_MatchClassLoader_process !\n");
//把jstring转成c的char
const char *cstr1 = (*env)->GetStringUTFChars(env, str1, 0);
const char *cstr2 = (*env)->GetStringUTFChars(env, str2, 0);
typedef jboolean(* TESTDLL)(jstring a,jstring b);
HINSTANCE hmod;
TESTDLL lpproc =NULL;
jboolean result=0;//返回结果
//加载DLL
hmod = LoadLibrary("Match.dll");
if(hmod == NULL) {
printf("hmod is null Not found Match.dll ! Please check Runtime environment \n");
return result;
}
//调用Process方法
lpproc = (TESTDLL)GetProcAddress(hmod,"Process");
//printf("debug \n");
result = lpproc(cstr1,cstr2);
FreeLibrary(hmod);
return result;
}



接下来再写个抛出方法定义文件matchload.def,这个可别忘了,没写是调不到的
[code=INIFile]
EXPORTS
Java_com_yujie_util_MatchClassLoader_process
[/code]
最后就可以开始编译了,激动人心的时刻到啦!
1.生成.o文件
gcc -c -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -o matchload.o matchload.c
2.生成.dll文件
gcc -shared -o matchload.dll matchload.o matchload.def
人品好的话,就可以看到matchload.dll文件啦,复制到JAVA_HOME/bin目录下然后调用MatchClassLoader.match()静态方法实现指纹对比
完
...全文

相关推荐

宁波维尔指纹仪二次开发接口

C1 指纹设备控件说明 控件名称:libFPDev WL ocx 控件ID :933DB2AB 51BF 4204 9E30 C907FE352A5E 控件说明:用于网页调用 采集指纹特征和模板 支持USB设备和RS232设备 调用方法 过程 例子:(请参考TestDevCtl html) var result dtm Method ; 执行接口函数">C1 指纹设备控件说明 控件名称:libFPDev WL ocx 控件ID :933DB2AB 51BF 4204 9E30 C907FE352A5E 控件说明:用于网页调用 采集指纹特征和模板 支持USB设备和RS232设备 调用方法 过程 例子:(请参考TestDevCtl html) var result dtm Method ; 执 [更多]

liu981101

中控 指纹仪 ZKFinger SDK live10R、live20R、live20M

中控 指纹仪 ZKFinger SDK live10R、live20R、live20M二次开发,包含windows版本与linux版本

hl84642354

中控指纹仪 考勤机 关于 java方面开发

中控指纹仪 考勤机 关于 java方面开发 online C# C++ Delhi Demo 下了肯定不 后悔,不过是9.0算法 没有 10的算法

wangyongchao880622

Live20R指纹仪程序员开发测试.zip

中控指纹仪Live20R开发包SDK文档和C#、C、ActiveX、java等多语言Demo

亿万富翁进化中

JNI技术手册 c/c++调用java

目录 I. 目录 1 II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 四 最后补充 11 III. java c/cpp互相调用实例(姊妹篇之二)——c/cpp调用java 11 一、 编写java代码 12 二、 编译java代码 12 三、 编写 C/C++ 代码 13 四、 运行exe 18 IV. Java JNI 编程进阶 18 一、 解决性能问题 18 二、 解决本机平台接口调用问题 19 三、 嵌入式开发应用(JNI小例子) 20 1、 新增一个基础类 22 2、 定义新类继承基础类 23 3、 编写调用类 23 4、 新增两个本地方法 24 5、 修改 RunMain 类 25 6、 新增一个方法处理java对象 26 7、 新增一个方法处理数组 29 8、 改写RunMain 32 四、 参考资料: 33 V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载软件 35 三、 MinGW的环境变量设置 35 1、 设置Path 35 2、 设置C_INCLUDE_PATH 35 3、 设置CPLUS_INCLUDE_PATH 35 四、 做一个小技巧修改 35 五、 安装CDT插件 36 1、 下载CDT插件 36 2、 安装CDT插件 36 六、 简单介绍CDT的使用吧 36 1、 新建一个C++项目 36 2、 输入New Project名字 36 3、 给项目新建一个的源文件 36 4、 接着出现文件添加的窗口,在File Name栏里面写上文件名 36 5、 编辑hello.cpp 37 6、 添加一个编译命令 37 七、 让我们开始进入真正的工作吧! 38 The Java side 38 1、 建立Java工程JavaHello,编写java类 38 2、 用命令生成头文件 38 The C side-Compiling the Library 40 1、 建立标准C工程Cpro,并生成dll文件 40 1) 将生成的头文件test_Hello.h拷贝到C工程Cpro下 40 2) 编写C类Hello.c,内容为: 40 3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41 7) Make Targets视图下双击step1,在C工程Cpro下生成hello.dll 文件。 41 2、 JAVA调用DLL 41 1) 将hello.dll拷贝到Java工程JavaHello下。 41 2) 运行Hello.java,则可以看到输出结果: 41 1) 将Hello.c改为Hello.cpp 41 2) 将makefile内容改为: 41 3) 其他的几乎都不用改变也可以。 42 评论: 42 VI. c++如何调用java程序 51 DemoMain.java内容如: 51 采用vc6++ IDE,采用JNI技术实现。 51 1、 编译时 51 2、 运行时 51 程序的关键在 53 VII. JNI 53 一、 定义 53 二、 设计目的 54 三、 书写步骤 54 1) 编写java程序:这里以HelloWorld为例。 54 2) 编译 55 3) 生成扩展名为h的头文件 55 4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。 56 5) 生成动态库 56 6) 运行程序 java HelloWorld就ok. 56 四、 调用中考虑的问题 56 1) java和c是如何互通的? 57 2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象的类定义: 59 三、 获取要调用的方法: 59 四、 调用JAVA类方法: 60 五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65

老黄忠
评论 5
收藏 已收藏
分享
返回顶部
langke93
Java SE 62,621 成员 307,251 内容