如题!

解决方案 »

  1.   

    你的类文件写对了吗?要加native标记啊?
      

  2.   

    native 是写了,属性不用吧?但是现在头文件里只有属性...
      

  3.   

    你从最简单的开始写咯,public class A {public native int methodA()}
    编译后运行javah A应该可以生成 A.h吧,里面应该有方法声明吧?或者你贴你的代码出来
      

  4.   


    package com.kcsj.bz;import javax.swing.JPanel;import com.kcsj.dao.entity.ByteBuff;public class FingerprintDriverControler
    {
        /*===========================错误码表===========================*/
        public static final int RUN_SUCCESS = 0;//成功
        public static final int ERR_FAILED_INIT = 1;//初始化失败
        public static final int ERR_FAILED_CALLDB = 2;//数据库操作失败
        public static final int ERR_MISTAKE_PARAM = 3;//参数错误
        public static final int ERR_FAILED_FUNCTION = 4;//方法执行失败
        public static final int ERR_OVERFLOW_MEMORY = 5;//内存溢出
        public static final int ERR_OVERFLOW_TIME = 6;//超时
        public static final int ERR_VERIFICATION_FAILED = 7;//验证失败
        public static final int ERR_UNKOWN_ERROR = 8;//未知错误
        public static final int ERR_ABSENCE_DEVICE = 9;//没有设备
        
        /*=============================常量值表==========================*/
        
        public static final int DEVTYPE_762164 = 1;//762164设备类型
        public static final int MAX_FP_WIDTH = 512;//指纹图象宽度
        public static final int MAX_FP_HEIGHT = 512;//指纹图象高度
        public static final int DEF_EXT_MINSIZE = 1024;//指纹特征值大小
        public static final int DEF_REG_MINSIZE = 1024;//指纹特征值大小
            /*=======================================需要在本地封闭的一些方法==================================*/    
        /*=============================1设备初始化==================================*/
        /** 
         *功能:初始化设备
         *参数:deviceType 设备类型,取值 1(或用常量 DEVTYPE_762164) 
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:应用程序启动后必须先调用此方法才能进行后续方法使用。
         */
        public native int driverInit(int deviceType);
            /*==============================2关闭设备===================================*/
        /**
         *功能:关闭设备
         *参数:无 
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:应用程序退出之前必须先调用此方法关闭设备。
         */
        public native int driverExit();
            /*===============================3获得亮度值==================================*/
        /**
         *功能:获得亮度值
         *参数:val 亮度的返回值,值范围 0 ~ 255
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:
         */
        public native int getBrightness(Byte val);
            /*===============================4获得对比度值================================*/
        /**
         * 功能:获得对比度值
         *参数:val 对比度的返回值,值范围 0 ~ 255
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:
         */
        public native int getContrast(Byte val);
            /*==================================5设置亮度===============================*/
        /**
         * 功能:设置亮度
         *参数:val 亮度值,值范围 0 ~ 255
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:亮度值建议设置在180 ~ 255,推荐255 
         */
        public native int setBrightness(Byte val);
            /*===================================6设置对比度==============================*/
        /**
         * 功能:设置对比度
         *参数:val 对比值,值范围 0 ~ 255
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:对比度值建议设置在 200 以上,推荐255 
         */
        public native int setContrast(Byte val);
            /*===================================7采集指纹图象============================*/
        /**
         * 功能:采集指纹图象
         *参数:imgBuff 返回指纹图象的缓冲区,大小为 512 * 512 字节;
         *      time 采集超时时间,单位秒,建议 5 ~ 10 。
         *      dispWnd 要显示指纹图象的window句柄,一般使用图片框,也可Panel等。
         *      quality 指纹图象质量要求,取值 0 ~ 255,建议50 ~ 75 ,推荐 65 或 70 。 
         *              取值太低将会使采集的图象不完整便返回,不足以提取有效的指纹特征。
         *              取值太高(超过80)将无法采集到确切的指纹图象。
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:提取指纹特征值之前,必须先采集指纹图象
         */
        public native int getLiveImage(ByteBuff imgBuff, int time, JPanel disWnd, int quality);
        
        
        /*============================8从指纹图象中提取指纹特征值=======================*/
        /**
         * 功能:从指纹图象中提取指纹特征值
         *参数:imgBuff 指纹图象的缓冲区(通过getLiveImage返回的imgBuff);
                min 指纹特征值,大小为 1024 字节 。
         *返回:成功返回 0 (RUN_SUCCESS)
         *备注:提取指纹特征值,以便进行指纹注册、比对
         */
        public native int getMinutiae(ByteBuff imgBuff, ByteBuff min);
        
        
        /*==================================9 注册指纹==================================*/
        /**
         * 功能:注册指纹
         * 参数: min1 第一次采集的指纹特征值(通过FPMGetMinutiae获得);
         *       min2 第二次采集的指纹特征值;
         *       min3 第三次采集的指纹特征值;
         *       regMin 输出的注册成功的指纹特征值,大小为 1024 字节;
         *       secuLevel 安全等级,取值 1 ~ 9 ,推荐 3 
         * 返回:成功返回 0 (RUN_SUCCESS)
         * 备注:注册登记指纹时,每枚手指要采集3次,经过3次采集后的min,调用此方法进行注册验证,如
         *       果3次采集的指纹不匹配,则登记失败,如能匹配,则登记成功,将把最终的特征值返回在
         *       regMin中,大小是1024。请保存该regMin到文件或数据库中,或其他您自定义的存储方式,以备以后进行指纹比对。
         *       存储时,务必将该特征值与用户ID号绑定在一起,例如如以文件方式保存,则可用用户ID做文件名。
         *       存储在数据库中时,可以将指纹特征值转换为文本形式。
         *       每次指纹采集时,请先移开手指,再按下,这样有利于采集到同一枚指纹更多的特征面。
         */
        public native int matchForRegister(ByteBuff min1, ByteBuff min2, ByteBuff min3,
                ByteBuff regMin, int secuLevel);
        
        
        /*=====================================10验证指纹===================================*/
        
        /**
         * 功能: 验证指纹 
         * 参数: inMin 要验证的指纹特征值;
         *        regMin 已登记的指纹特征值;
         *        secuLevel 安全等级,推荐值 3 。 
         * 返回: 成功返回 0 (RUN_SUCCESS)
         * 备注: 该方法也称 1:1 比对方式。
         *        先根据用户ID,提取用户已登记的指纹特征值 regMin;调用 FPMGetLiveImage 和 
         *        FPMGetMinutiae 获得当前要比对的用户的指纹特征值 inMin;然后使用该方法进行比对,如返回
         *        成功,则说明当前用户就是该ID的用户。
         *        1:1比对方式快捷、安全度高,但不能自动识别出用户,需要用户输入ID,类似于传统的密码验证方式,
         *        由用户ID获取密码段,与当前的输入密码进行比对以确定用户是否正确。
         */
        
        public native int Verification(ByteBuff inMin, ByteBuff regMin, int secuLevel);
        
        
    /*=====================================================================================================*/
        
        
        /*================================载入本地动态库================================*/
        
        static 
        {
            System.loadLibrary(FingerprintDriverControler);
        }
        
    }ByteBuff 是自定义的一个类,封装了字节数组。
      

  5.   


    生成的源码如下
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_kcsj_bz_FingerprintDriverControler */#ifndef _Included_com_kcsj_bz_FingerprintDriverControler
    #define _Included_com_kcsj_bz_FingerprintDriverControler
    #ifdef __cplusplus
    extern "C" {
    #endif
    #undef com_kcsj_bz_FingerprintDriverControler_RUN_SUCCESS
    #define com_kcsj_bz_FingerprintDriverControler_RUN_SUCCESS 0L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_FAILED_INIT
    #define com_kcsj_bz_FingerprintDriverControler_ERR_FAILED_INIT 1L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_FAILED_CALLDB
    #define com_kcsj_bz_FingerprintDriverControler_ERR_FAILED_CALLDB 2L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_MISTAKE_PARAM
    #define com_kcsj_bz_FingerprintDriverControler_ERR_MISTAKE_PARAM 3L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_FAILED_FUNCTION
    #define com_kcsj_bz_FingerprintDriverControler_ERR_FAILED_FUNCTION 4L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_OVERFLOW_MEMORY
    #define com_kcsj_bz_FingerprintDriverControler_ERR_OVERFLOW_MEMORY 5L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_OVERFLOW_TIME
    #define com_kcsj_bz_FingerprintDriverControler_ERR_OVERFLOW_TIME 6L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_VERIFICATION_FAILED
    #define com_kcsj_bz_FingerprintDriverControler_ERR_VERIFICATION_FAILED 7L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_UNKOWN_ERROR
    #define com_kcsj_bz_FingerprintDriverControler_ERR_UNKOWN_ERROR 8L
    #undef com_kcsj_bz_FingerprintDriverControler_ERR_ABSENCE_DEVICE
    #define com_kcsj_bz_FingerprintDriverControler_ERR_ABSENCE_DEVICE 9L
    #undef com_kcsj_bz_FingerprintDriverControler_DEVTYPE_762164
    #define com_kcsj_bz_FingerprintDriverControler_DEVTYPE_762164 1L
    #undef com_kcsj_bz_FingerprintDriverControler_MAX_FP_WIDTH
    #define com_kcsj_bz_FingerprintDriverControler_MAX_FP_WIDTH 512L
    #undef com_kcsj_bz_FingerprintDriverControler_MAX_FP_HEIGHT
    #define com_kcsj_bz_FingerprintDriverControler_MAX_FP_HEIGHT 512L
    #undef com_kcsj_bz_FingerprintDriverControler_DEF_EXT_MINSIZE
    #define com_kcsj_bz_FingerprintDriverControler_DEF_EXT_MINSIZE 1024L
    #undef com_kcsj_bz_FingerprintDriverControler_DEF_REG_MINSIZE
    #define com_kcsj_bz_FingerprintDriverControler_DEF_REG_MINSIZE 1024L
    #ifdef __cplusplus
    }
    #endif
    #endif
      

  6.   

    我去掉了你包名和ByteBuff的类,生成了正确的.h文件(是否你的ClassPath设置不正确?)
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class FingerprintDriverControler */#ifndef _Included_FingerprintDriverControler
    #define _Included_FingerprintDriverControler
    #ifdef __cplusplus
    extern "C" {
    #endif
    #undef FingerprintDriverControler_RUN_SUCCESS
    #define FingerprintDriverControler_RUN_SUCCESS 0L
    #undef FingerprintDriverControler_ERR_FAILED_INIT
    #define FingerprintDriverControler_ERR_FAILED_INIT 1L
    #undef FingerprintDriverControler_ERR_FAILED_CALLDB
    #define FingerprintDriverControler_ERR_FAILED_CALLDB 2L
    #undef FingerprintDriverControler_ERR_MISTAKE_PARAM
    #define FingerprintDriverControler_ERR_MISTAKE_PARAM 3L
    #undef FingerprintDriverControler_ERR_FAILED_FUNCTION
    #define FingerprintDriverControler_ERR_FAILED_FUNCTION 4L
    #undef FingerprintDriverControler_ERR_OVERFLOW_MEMORY
    #define FingerprintDriverControler_ERR_OVERFLOW_MEMORY 5L
    #undef FingerprintDriverControler_ERR_OVERFLOW_TIME
    #define FingerprintDriverControler_ERR_OVERFLOW_TIME 6L
    #undef FingerprintDriverControler_ERR_VERIFICATION_FAILED
    #define FingerprintDriverControler_ERR_VERIFICATION_FAILED 7L
    #undef FingerprintDriverControler_ERR_UNKOWN_ERROR
    #define FingerprintDriverControler_ERR_UNKOWN_ERROR 8L
    #undef FingerprintDriverControler_ERR_ABSENCE_DEVICE
    #define FingerprintDriverControler_ERR_ABSENCE_DEVICE 9L
    #undef FingerprintDriverControler_DEVTYPE_762164
    #define FingerprintDriverControler_DEVTYPE_762164 1L
    #undef FingerprintDriverControler_MAX_FP_WIDTH
    #define FingerprintDriverControler_MAX_FP_WIDTH 512L
    #undef FingerprintDriverControler_MAX_FP_HEIGHT
    #define FingerprintDriverControler_MAX_FP_HEIGHT 512L
    #undef FingerprintDriverControler_DEF_EXT_MINSIZE
    #define FingerprintDriverControler_DEF_EXT_MINSIZE 1024L
    #undef FingerprintDriverControler_DEF_REG_MINSIZE
    #define FingerprintDriverControler_DEF_REG_MINSIZE 1024L
    /*
     * Class:     FingerprintDriverControler
     * Method:    driverInit
     * Signature: (I)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_driverInit
      (JNIEnv *, jobject, jint);/*
     * Class:     FingerprintDriverControler
     * Method:    driverExit
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_driverExit
      (JNIEnv *, jobject);/*
     * Class:     FingerprintDriverControler
     * Method:    getBrightness
     * Signature: (Ljava/lang/Byte;)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_getBrightness
      (JNIEnv *, jobject, jobject);/*
     * Class:     FingerprintDriverControler
     * Method:    getContrast
     * Signature: (Ljava/lang/Byte;)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_getContrast
      (JNIEnv *, jobject, jobject);/*
     * Class:     FingerprintDriverControler
     * Method:    setBrightness
     * Signature: (Ljava/lang/Byte;)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_setBrightness
      (JNIEnv *, jobject, jobject);/*
     * Class:     FingerprintDriverControler
     * Method:    setContrast
     * Signature: (Ljava/lang/Byte;)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_setContrast
      (JNIEnv *, jobject, jobject);/*
     * Class:     FingerprintDriverControler
     * Method:    getLiveImage
     * Signature: (LByteBuff;ILjavax/swing/JPanel;I)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_getLiveImage
      (JNIEnv *, jobject, jobject, jint, jobject, jint);/*
     * Class:     FingerprintDriverControler
     * Method:    getMinutiae
     * Signature: (LByteBuff;LByteBuff;)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_getMinutiae
      (JNIEnv *, jobject, jobject, jobject);/*
     * Class:     FingerprintDriverControler
     * Method:    matchForRegister
     * Signature: (LByteBuff;LByteBuff;LByteBuff;LByteBuff;I)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_matchForRegister
      (JNIEnv *, jobject, jobject, jobject, jobject, jobject, jint);/*
     * Class:     FingerprintDriverControler
     * Method:    Verification
     * Signature: (LByteBuff;LByteBuff;I)I
     */
    JNIEXPORT jint JNICALL Java_FingerprintDriverControler_Verification
      (JNIEnv *, jobject, jobject, jobject, jint);#ifdef __cplusplus
    }
    #endif
    #endif
      

  7.   

    啊?是什么原因导致的?因为在指纹仪给的方法里面有 byte * 我就想用ByteBuff来代替,会不会是因为这个导致的生成不了。还是,因为用的JDK版本不一样导致的?主要是不找到原因,我就没办法继续了!非常感谢啊!
      

  8.   

    ByteBuff我也弄了个类出来,应该不是问题。估计是自动生成不正确吧,你手工编译运行javah试试吧
      

  9.   


    其实我一直都是用手工生成的,但是一直生成不了,刚试了还是这样。难道是这javah.exe有问题?我再下个其他版本的JDK试试吧。谢谢大哥帮忙了!
      

  10.   

    终于找到原因了!原来是最后一行载入链接库出的问题。把里面的链接库改为null就可以了!惭愧!