加载.dll时出现java.lang.UnsatifiedLink错误

加载.dll时出现java.lang.UnsatifiedLink错误,java,dll,java-native-interface,Java,Dll,Java Native Interface,我试图在JAVA的.dll文件中使用公共接口。这是.dll中的公共接口显示的内容: // Interface declaration. public interface ISslTcpClient { string Encrypt(string requestContent); string Decrypt(string requestContent); }; 下面是我在eclipse中加载dll并在Java应用程序中使用它的方法: public class N

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

// Interface declaration.
public interface ISslTcpClient
{
    string Encrypt(string requestContent);
    string Decrypt(string requestContent);        
};
下面是我在eclipse中加载dll并在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)

请告诉我如何解决此问题,我将不胜感激。

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

此接口看起来肯定像是用.NET C编写的。因此,您不需要调用本机DLL,而需要调用托管.NET DLL,这是完全不同的主题

你可以自己用NC++的代码包包装.NET DLL,并从java调用它,但是障碍和挑战的数量是巨大的…您需要关心类型转换、内存管理、线程、C++运行时的定义以及更多…因此,不建议采用这种方法

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

使用您的界面时,您希望:

Javonet.addReference("ICVTnsClient.dll");

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

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

您可以获得学术和非商业用途的免费许可证,或者尝试免费试用:

它找不到您正在调用的任何内容。如果我只使用静态{System.loadLibraryCvTnsClient;},它可以工作。我尝试将名称从ICVTnsClient更改为某个错误的名称,以查看它是否给了我错误,并且它确实给了我一个执行选项。当我试图从接口使用加密方法时,问题出现了。我手头有最终的dll。我没有生成dll时使用的实际代码。你认为我应该写一个C代码吗?我认为dll是用C来使用dll中的方法,然后再创建一个与我的JAVA一起工作的附加dll是一个好主意?在这种情况下,你一定已经更改了JAVA代码,使其与本机代码不一致。不同的包、类名或方法名。谢谢你的帮助。为了回答你的第二个问题,我提到的接口是C dll中的接口。DLL的文档说明使用这些接口。这个dll是为了在C代码中使用,但我正试图在JAVA应用程序中使用它。C代码是否需要修改为与JNI兼容?是的,或者按照您在上面的评论中所说的做:从javah步骤开始,创建一个调用此代码的JNIDLL。不能直接从Java调用任何旧的DLL。