加载.dll时出现java.lang.UnsatisfiedLinkError

时间:2015-02-26 22:05:29

标签: java dll java-native-interface

我正在尝试在JAVA中的.dll文件中使用公共接口。这就是.dll中的公共接口显示的内容:

// Interface declaration.
public interface ISslTcpClient
{
    string Encrypt(string requestContent);
    string Decrypt(string requestContent);        
};

以下是我如何加载我的dll并在eclipse中的Java应用程序中使用它:

public class NJInew {
    static {
        System.loadLibrary("ICVTnsClient");
    }

    native String Encrypt(String requestContent);

    public static void main(String[] args) {      
        NJInew p= new NJInew ();
        p.Encrypt("pejman");

    }

} 但是我收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: NJInew.Encrypt(Ljava/lang/String;)Ljava/lang/String;
at NJInew.Encrypt(Native Method)
at NJInew.main(NJInew.java:13)

请让我知道如何解决这个问题,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

我不明白本机DLL如何看起来像Java接口。你确定它是一个JNI DLL吗?您无法从Java调用任何旧DLL。如果它不是JNI DLL,你需要向它添加所需的JNI入口点,从javah工具开始,或者编写一个包含这些的包装DLL并调用它。

答案 1 :(得分:0)

这个界面看起来非常像用.NET C#编写的。因此,您不需要调用本机DLL,而是管理.NET DLL,这是完全不同的主题。

您可以通过使用本机C ++代码包装.NET DLL并从JAVA调用它来实现它,但是存在许多障碍和挑战......您需要处理类型转换,内存管理,线程,C ++运行时depndencies以及更多...所以不推荐这种方法。

你应该寻找的是像Javonet这样的本地网桥,它会为你处理所有这些事情,并确保你可以在任何机器上运行你的代码。

使用你的界面就像这样:

Javonet.addReference("ICVTnsClient.dll");

NObject client = Javonet.New("SslTcpClient"); 
//some concreto type which implements this interface

String encryptedStr = client.invoke("Encrypt", "some string");

您可以获得学术和非商业用途的免费许可或尝试免费试用:http://www.javonet.com