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

我试图通过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”中的exceptionjava.lang.UnsatisfiedLinkError:查找函数’Login’时出错:找不到指定的过程。

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

解决方案基于这种方法:

枚举/常量在java中为dll处理。

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

java中SOP行的输出是:

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

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

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