java中dll方法的访问

java中dll方法的访问,java,dll,java-native-interface,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 =

我正在尝试访问用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”

那么在这里它能调用这个方法吗?

您对JNI的使用是不正确的。在C#库中使用JNI是困难的(尽管并非不可能)。有一个关于如何去做的很好的教程。在谷歌上进行C#JNI搜索将揭示更多信息

你也应该调查一些事情,比如

编辑


是一个很酷的解决方案。

如果这些方法实际上是按这种方式设计的,那么您只能通过JNI调用这些方法。你的方法绝对不是。你在这里所做的事情(抱歉这么直截了当地说)绝对没有成功的机会——它根本不这样做

有几种方法可以继续。其中之一就是学习JNI以及如何编写实际使用它的库。是对此的规范引用。不过,用C#实现这一点又增加了一层复杂性

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

试试看。从他们的网站。这里有一些详细的解释->

对您有帮助的网站:

尝试:

您需要在上面的链接中描述的C++ DLL中包装DLL。只需用“Java-JNI MyJNI”命令生成头文件,并在其中包含一个函数签名的C++ DLL,就可以找到。


看一看:对于C#

中的一个特定的“hello world”示例,您需要使用
System.loadLibrary()
加载您的本机库--最好是静态加载initializer@fge我做到了。它不起作用。你当然知道.NET dll不是标准的dll,它们本身不能与JNI一起工作。@HovercraftFullOfEels:我不明白你想说的。再看一眼。。。您尝试使用JNI,但甚至不尝试让Java和您的本机代码进行通信。没有在Java代码中声明本机方法,没有在本机代码中创建JVM。。。你想达到什么目的?第一个链接不是我想做的。它是关于Visual C++和java的。这是通过JNI完成的,但我想在c#和java之间使用JNI或不使用JNI。在第二个链接中,我的问题也没有答案。JNI与C#没有直接接口。。您必须在C++和JavaOOOH之间创建一个C++存根,我为您找到了一个很酷的解决方案。正如Jayan所说,jni4net很好,但是…@ankur trapasiya-Ernest Friedman Hill的建议绝对正确!请听他说@保罗4:我正试着和JNA一起做。
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());
    }
  }
}