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



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

下面是ADHelper.dll中Procedure的定义:

 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为enum类型:

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: Error查找函数"Login":指定的过程不能发现。

如果需要更多的细节,请告诉我。

解决方案基于以下方法:

Java中枚举/常量的处理

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

java中SOP行输出为:

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

这里的问题是,你的DLL是一个。net DLL,这不是一个本地DLL。JNA只加载和理解本地dll,也就是那些在。net框架之外运行的dll。

这意味着在Java和。net之间需要一种不同的粘合剂。我已经成功地使用了Jni4net和IKVM,还有一些其他的,您可能想看看它们。

相关内容

  • 没有找到相关文章

最新更新