2011-12-30 5 views
6

Я пытаюсь получить доступ к dll-методам в java, который был написан в C#. Из следующего кода я пытаюсь построить dll, который сгенерирован успешно.Доступ к методам dll в java

using System; 
using Microsoft.Win32; 


namespace CyberoamWinHelper 
{ 
    public class RegistryAccess 
    {   
     public static String getValue(String key) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      RegistryKey rk1=rk.OpenSubKey("Software\\Test", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl); 
      rk1.SetValue(key, "val1"); 
      return rk1.GetValue(key).ToString(); 
     } 
     public static void createSubkey(String name) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      rk.CreateSubKey("Software\\Test"); 
     } 
    } 
} 

После этого я загрузке DLL генерируется в моей Java программный код, который выглядит следующим образом

public class JNI { 

    /** 
    * @param args the command line arguments 
    */ 
    public native String getValue(String key);  

    public static void main(String[] args) { 
     // TODO code application logic here 

     try 
     { 
      System.loadLibrary("CyberoamWinHelper"); 
      JNI j=new JNI();  
      System.out.println(j.getValue("abc")); 
     } 
     catch(UnsatisfiedLinkError e) 
     { 
      System.out.println("Ex" + e.getMessage()); 
     } 
    } 
} 

После выполнения этого кода он дает мне следующую ошибку.

"Exjni.JNI.getValue(Ljava/lang/String;)Ljava/lang/String;" 

Ну, я не понимаю, что говорит эта ошибка, но я хочу ее решить. И еще один вопрос, который у меня есть, так как метод, который я вызываю, является статическим методом, он будет вызван таким образом? я имею в виду вызвать статический метод нам нужно

«classname.methodname»

так что здесь он будет иметь возможность вызвать метод?

+0

Вы должны загрузить исходную библиотеку с 'System.loadLibrary()' - предпочтительно в статическом инициализатор – fge

+0

@fge: я сделал это . Это не сработало. – ankurtr

+0

Вы знаете, конечно, что .NET dll не являются стандартными dll и сами по себе не работают с JNI. –

ответ

7

Вы можете вызвать методы только через JNI, если эти методы на самом деле предназначены для вызова таким образом. Твоих методов совсем нет. То, что вы здесь делаете (извините за то, что так грубо), абсолютно никаких шансов на успех - просто так не получается.

Есть несколько способов, которыми вы можете продолжить. Можно было бы узнать о JNI и о том, как писать библиотеки, которые на самом деле работают с ним. Here - это каноническая ссылка для этого. Однако при этом с C# добавляется еще один уровень сложности.

Другим способом было бы отказаться от JNI вообще и использовать более подходящий механизм для доступа к методам. Здесь вы можете узнать о JNA; это было бы полностью лучше для ваших целей.

+1

@ ankur-trapasiya - предложения Эрнеста Фридмана-Хилла абсолютно, абсолютно правильные! Пожалуйста, послушайте его! – paulsm4

+0

@ paulsm4: Я пытаюсь сделать это с помощью JNA. – ankurtr

0

Ваше использование JNI неверно. Трудно (хотя и не невозможно) использовать JNI с библиотеками C#. Существует отличный учебник о том, как это сделать here. Выполнение поиска JNI C# в google должно показать больше.

Вы должны также исследовать что-то вроде Grasshopper ..

EDIT

http://caffeine.berlios.de/site/documentation/quickstart.html

прохладное решение.

+0

Ну, первая ссылка - это не то, что я пытаюсь сделать. Речь идет о визуальных C++ и java. Это делается через JNI, но я хочу сделать это между C# и java с JNI или без него. И во второй ссылке также нет ответа на мой вопрос. – ankurtr

+1

JNI не имеет прямого интерфейса с C#. Вам нужно создать C++-заглушку между C# и Java. –

+0

OOooh Я нашел для вас прекрасное решение. jni4net хорош, как указано Jayan, но ... –

0

Полезный сайт для вас: http://www.sahirshah.com/java/jni.html

Try:

public class myJNI { 

/** 
* @param args the command line arguments 
*/ 
public static native String getValue(String key);  
static 
{ 
    System.loadLibrary("CyberoamWinHelper"); 
} 
public static void main(String[] args) { 
    // TODO code application logic here 

    try 
    {  
     String myKey = "abc"; 
     System.out.println(getValue(myKey)); 
    } 
    catch(UnsatisfiedLinkError e) 
    { 
     System.out.println("Ex" + e.getMessage()); 
    } 
    } 
} 

Вам нужно обернуть DLL в DLL C++, как описано в приведенной выше ссылке. Просто сгенерируйте заголовочный файл с помощью команды «javah -jni myJNI» и создайте dll C++ с сигнатурой функции, найденной в этом заголовочном файле.

Посмотрите: http://www.codeproject.com/KB/cross-platform/javacsharp.aspx для конкретного «привет мир» пример в C#

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