簡體   English   中英

加載.dll時出現java.lang.UnsatisfiedLinkError

[英]java.lang.UnsatisfiedLinkError when loading .dll

我試圖在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)

請讓我知道如何解決這個問題,我將不勝感激。

我不明白本機DLL可能看起來像Java接口。 你確定它是一個JNI DLL嗎? 您無法從Java調用任何舊DLL。 如果它不是JNI DLL,你需要向它添加所需的JNI入口點,從javah工具開始,或者編寫一個包含這些的包裝DLL並調用它。

這個界面看起來非常像用.NET C#編寫的。 因此,您不需要調用本機DLL但管理.NET DLL,這是完全不同的主題。

您可以通過使用本機C ++代碼包裝.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");

您可以獲得學術和非商業用途的免費許可,或者嘗試免費試用: http//www.javonet.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM