在java中访问dll方法

时间:2011-12-30 01:05:08

标签: java dll java-native-interface

我正在尝试访问用c#编写的java中的dll方法。从以下代码我试图构建成功生成的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");
        }
    }
}

在此之后我将在我的java程序代码中加载生成的dll,如下所示

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 个答案:

答案 0 :(得分:7)

如果这些方法实际上是设计为以这种方式调用,那么你只能通过JNI调用方法。你的方法绝对不是。你在这里做的事情(抱歉这么直率)绝对没有机会取得成功 - 它根本不起作用。

您可以通过多种方式继续进行。一个是学习JNI以及如何编写实际使用它的库。 Here是对此的规范参考。但是,使用C#执行此操作会增加另一层复杂性。

另一种方法是完全放弃JNI并使用更合适的机制来访问这些方法。你可以在这里了解JNA;它完全更适合你的目标。

答案 1 :(得分:1)

试试jni4net。从他们的网站。这里有一些详细的解释 - > How calling from Java to .NET works in jni4net

答案 2 :(得分:0)

您对JNI的使用不正确。将JNI与C#库一起使用很困难(尽管不是不可能)。有一个关于如何实现它的优秀教程here。在谷歌上进行C#JNI搜索会显示更多内容。

您还应该调查类似Grasshopper ..

的内容

修改

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

是一个很酷的解决方案。

答案 3 :(得分:0)

有用的网站: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包装在c ++ dll中,如上面的链接所述。只需使用“javah -jni myJNI”命令生成一个头文件,并使用该头文件中的函数签名构建一个c ++ dll。

请查看:http://www.codeproject.com/KB/cross-platform/javacsharp.aspx,了解C#

中特定的“hello world”示例