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

langke93 2009-03-11 11:01:17
首先国际惯例,先说明概念
什么是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()静态方法实现指纹对比
...全文
247 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
学习中……希望与大虾交流学习!!!
cgaolei 2009-06-11
  • 打赏
  • 举报
回复
LZ试过JNA(Java Native Access)API没有??可以省去很多写JNI的麻烦。推荐一下。https://jna.dev.java.net/
China刘老头 2009-06-11
  • 打赏
  • 举报
回复
高人,深度学习
denghan 2009-03-13
  • 打赏
  • 举报
回复
不错。学习了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧