2015-02-26 3 views
0

Я пытаюсь использовать открытый интерфейс в DLL-файле в JAVA. Это то, что общедоступный интерфейс в .dll показывает:java.lang.UnsatisfiedLinkError при загрузке .dll

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

Вот как я загружаю свою DLL и использовать его в своем приложении Java в Eclipse:

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) 

Пожалуйста, дайте мне знать, как исправить эту проблему, и я был бы очень признателен.

+0

Он не может найти то, что вы призвание. – roxan

+0

, если я просто использую статические { \t \t System.loadLibrary ("ICVTnsClient"); \t} он работает. Я попытался сменить имя из ICVTnsClient на некорректное имя, чтобы узнать, дает ли он мне ошибку, и это дало возможность. Проблема возникает, когда я пытаюсь использовать метод Encrypt из интерфейса –

ответ

0

Я не понимаю, как родная DLL может выглядеть как интерфейс Java. Вы уверены, что это JNI DLL? Вы не можете вызывать старую DLL из Java. Если это не JNI DLL, вам нужно будет добавить к нему необходимые точки входа JNI, начиная с инструмента javah, или написать DLL-оболочку, содержащую эти и вызовы.

+0

У меня есть последняя dll в руке. У меня нет фактического кода, который использовался при создании этой DLL. Как вы думаете, может быть, я должен написать код C# (я думаю, что dll находится на C#), чтобы использовать методы в этой DLL, а затем создать дополнительную dll, которая работает с моей JAVA, хорошая идея? –

+0

В этом случае вы, должно быть, изменили код Java, чтобы не согласиться с собственным кодом. Различные имена пакетов, классов или методов. Откат. – EJP

+0

Спасибо за помощь. Чтобы ответить на ваш второй вопрос, интерфейс, на который я обращался, это интерфейс в C# dll. Документация DLL говорит об использовании этих интерфейсов. Эта dll предназначена для использования в коде C#, но я пытаюсь использовать ее в нашем приложении JAVA. Нужен ли код C# для совместимости с JNI? –

0

Этот интерфейс определенно похож на написанный на .NET C#. Поэтому вам не нужно вызывать родную DLL, но управляемую .NET DLL, и это совершенно другая тема.

Вы можете достичь этого сами, обернув .NET DLL собственным кодом на C++ и назвав его из JAVA, но количество препятствий и проблем огромно ... Вам нужно позаботиться о преобразовании типов, управлении памятью, потоках, времени выполнения на C++ depandencies и многое другое ... так что подход не рекомендуется.

Что нужно искать - это родной мост, такой как 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

Смежные вопросы