首先国际惯例,先说明概念
什么是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()静态方法实现指纹对比