Доступ к методам DLL в Java - PullRequest
       7

Доступ к методам DLL в Java

6 голосов
/ 30 декабря 2011

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

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"

так вот он сможет вызвать метод?

Ответы [ 4 ]

7 голосов
/ 30 декабря 2011

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

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

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

1 голос
/ 30 декабря 2011

Попробуйте jni4net .С их веб-сайта.Некоторое подробное объяснение здесь -> Как звонки из Java в .NET работают в jni4net

0 голосов
/ 30 декабря 2011

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

Попробуйте:

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 #

0 голосов
/ 30 декабря 2011

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

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

EDIT

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

- это классное решение.

...