关于jna调用dll动态库的,公司最近有个需求需要调用到指纹厂商提供的dll,调用dll的指纹对比接口,调用完后返回0为成功,我放上去两个指纹特征,同一个手指的特征返回值不是0公司以前用.net调用过这个接口是没有问题的package com.dingding.dll;import java.util.Base64;import com.sun.jna.Library;
import com.sun.jna.Native;public class YOYON_Manager_Lib { public interface YOYON extends Library {

YOYON INATANCE = (YOYON) Native.loadLibrary("YOYON_Matching_Lib", YOYON.class); // 引用指纹对比函数
public int CommandProc(int CmdCode,String inFeaturesA, String inFeaturesB, int ParamValue);

//引用指纹对比函数(此为.net调用dll时的接口)
    /*    [DllImport("YOYON_Matching_Lib", EntryPoint = "CommandProc")]
        public static extern int CommandProc(int CmdCode, byte[] inFeaturesA, byte[] inFeaturesB, int ParamValue);*/
} public static void main(String[] args) throws Exception {
System.setProperty("jna.encoding", "utf8");
String v1 = "gSo6xe99VHz0MlGfCH+HGgvS8Py+V4atxYfVdntFq5CYlL5RwWl3NmME1KQWQgMh7NUcavdC/NkG+TUoFmMb0O+oz6wXVb8B0v7jkHOrLmqY0LYTGQKd3xtO7VlQLsYLYyutsEUyyGZ0TrupT/Ab09ExGnVt2IFZe/sX4B6Pjx8C57M2ey4Cu1+vMImodvJ/u51tLJEe4Wl7S5clZD6Nz2YjCGV69odX6uVMy7Ji1IcglgFppAratq3CfaW/Qk9ClW/86tgmNOBAHsPUyxfEUCr53nBYsLOqwMbnA1CFLjX0zuGm7Es2rkP93usMAAHJhf78ThDsBi5wNqQ9GlU+BWwY26ertUqzxtukIYySRSCUA/lYTZhZvIXcpR9uNi8t6ctpIemfsyFmK2AJH2eV47+uDP+WhrHfGMB4v8dYJidXC31Uu144m62T1/M+DanZjaJKm+bNUgvTkhZ9kDv5uGpUJL22seKj+5YdqV7olJ+adVmtIp7LjSxmX9Ub+hWd3xbn9sD6y9tJ7fab9pf7Lea6j3u3+vr6G7tk7V9xTKImeao141FJ1qf1mXldRU+cGmEzcqJZuXLW2qAEhoAe3GoOeTyXG/LYz9H29rRGOSRrpG2uQD//hwNn9r5y3eyGGMCorUjgPt+wlnzb58LxrjUY94TrMsQivRmeafb3hHQ=";
String v2 = "Te485lc18ln+6BckWHWG2ZAprNd4S3gA2ackuhgUmAS2yv5wa7vNogCi9TXMqvdGYYy/79JGNujYEkX8WRoWvSl8xf5v5dpNLfM+HzbiNH3C/m7nIS6xzb4czTtpY2n1Lk/333lQ3lv5GGxIUFIUpplAYVSpGhAUYJl8EiRqOQ5ituOLmvyWwGITAM7rQ1oW76tKcbjEW5rpFWW5mOSBbXvI0MxHUEYtvR7y8Be7CSkmsanSpNEtg1errtohxJYFmCXxrlGbsI/5oNpZPHMRE5OO8IBeyPg1S3oQzo+I4MLlUQglpIJ9uMR4N4uje3flYL9q2Cn8Yu0tY58bt9nudO7C8bthA9wKOnlbr0tiy4i6KVh+OUuspzhUi3Pcp9pSnQskXDKbIPNFVuNJpNB8+jmlPDWqlY2tvGeqRGtEudIG1UE76M9hSaGiu9HX9hJBlD8k5d/wt/1aJ79S7M/6HREQ2JTv7V8B/Rc/YSe1LAtELxR9Ccq2uqRbotfKtSGMkkUglAP5WE2YWbyF3KUfbjYvLenLaSHpn7MhZitgCR9nleO/rgz/loax3xjAeL/HWCYnVwt9VLteOJutk9fzPg2p2Y2iSpvmzVIL05IWfZA7+bhqVCS9trHio/uWHale6JSfmnVZrSKey40sjCWP8gWe84eLMa1rvp9x+ELZK4U=";
//byte[] b1 = toByte(v1);
//byte[] b2 = toByte(v2);
// System.out.println(b1);
// System.out.println(b2);
//System.out.println(YOYON.INATANCE);
int flag = YOYON.INATANCE.CommandProc(0x4000, v1, v2, 0);
System.out.println(flag);
}

public static byte[] toByte(String finger) {
// Original byte[]
byte[] bytes = finger.getBytes(); // Base64 Encoded
String encoded = Base64.getEncoder().encodeToString(bytes); // Base64 Decoded
byte[] decoded = Base64.getDecoder().decode(encoded);
return decoded; }
下图为返回结果两次运行同一代码返回结果不同同一指纹特征返回的却不是0

解决方案 »

  1.   

    你的接口类型对吗,.net是byte[],而你传的是String
    public static extern int CommandProc(int CmdCode, byte[] inFeaturesA, byte[] inFeaturesB, int ParamValue);这个是后来你改成java的时候加的吗
    public int CommandProc(int CmdCode,String inFeaturesA, String inFeaturesB, int ParamValue);光有一个接口调用和返回结果,看不出什么,你的接口内部实现什么的,有可能有问题
      

  2.   

    主要实现的是指纹对比的,用byte[]入参我也试过,返回结果也是一样的,dll封装的函数原型这边已经找不到了项目是一个二次开发的项目,比较老了
      

  3.   

    主要实现的是指纹对比的,用byte[]入参我也试过,返回结果也是一样的,dll封装的函数原型这边已经找不到了项目是一个二次开发的项目,比较老了