[英]java.lang.UnsatisfiedLinkError when loading topaz dll in OSGI environement
[英]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.