JNA无法通过java在dll文件中找到指定的过程

时间:2015-06-01 04:08:07

标签: java c# dll enums jna

我试图通过java访问dll程序但我的java方法无法找到该程序。 dll文件已成功加载,但是名为Login I的C#代码中的过程无法调用。

以下是ADHelper.dll中的过程def:

 public static ADHelper.LoginResult Login(string UserName, string Password)
    {
      if (!ADHelper.IsUserValid(UserName, Password))
        return ADHelper.LoginResult.LOGIN_USER_DOESNT_EXIST;
      DirectoryEntry user = ADHelper.GetUser(UserName);
      if (user == null)
        return ADHelper.LoginResult.LOGIN_USER_DOESNT_EXIST;
      int userAccountControl = Convert.ToInt32(RuntimeHelpers.GetObjectValue(user.Properties["userAccountControl"][0]));
      user.Close();
      return !ADHelper.IsAccountActive(userAccountControl) ? ADHelper.LoginResult.LOGIN_USER_ACCOUNT_INACTIVE : ADHelper.LoginResult.LOGIN_OK;
    }

dll文件名是ADHelper.dll。 LoginResult是枚举类型:

public enum LoginResult
    {
      LOGIN_OK,
      LOGIN_USER_DOESNT_EXIST,
      LOGIN_USER_ACCOUNT_INACTIVE,
    }

以下是我通常调用过程的java程序:

package dllTest;

import com.sun.jna.*;

public class DllTester {




         public interface ADHelper extends Library {    

             public final int LOGIN_OK=1;
             public final int LOGIN_USER_DOESNT_EXIST=2;
             public final int LOGIN_USER_ACCOUNT_INACTIVE=3;


               public int Login(String user, String pass);
           }
           public static void main(String[] args) {


            ADHelper objADH = (ADHelper) Native.loadLibrary("ADHelper", ADHelper.class);
            System.out.println(objADH.getClass().getDeclaredMethods()); 
            objADH.Login("ashish", "asdas");


           }

}

现在,它出现以下错误:

  

线程中的异常" main" java.lang.UnsatisfiedLinkError:错误   查找功能'登录':指定的程序不可能   找到。

请告诉我是否需要更多细节。

解决方案基于这种方法:

enums/constants handling in java for dll.

注意:我已经在system32中包含了dll文件用于测试目的,以便于访问。 dll文件正在加载,但Login函数没有调用。

java中SOP行的输出是:

[Ljava.lang.reflect.Method;@145d068

1 个答案:

答案 0 :(得分:1)

这里的问题是您的DLL是.Net DLL,它不是本机DLL。 JNA只加载和理解本机DLL,即为在.Net框架之外运行而构建的DLL。

这意味着您需要在Java和.Net之间使用不同的粘合剂。我已经成功地使用了Jni4netIKVM,还有其他几个,你可能想看看那些。