Доступ к методам dll в java

Я пытаюсь получить доступ к методам 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("SoftwareTest", 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("SoftwareTest");
        }
    }
}

после этого я загружаю сгенерированную 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 ответов


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

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

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


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


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

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

редактировать

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

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


полезный сайт для вас: 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 для конкретного примера "hello world" в В C#