在java中访问dll方法

tra*_*ank 6 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此之后我在我的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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此代码后,它给我以下错误.

"Exjni.JNI.getValue(Ljava/lang/String;)Ljava/lang/String;"
Run Code Online (Sandbox Code Playgroud)

好吧,我不明白这个错误是什么,但我想解决它.我还有一个问题是,因为我调用的方法是一个静态方法,它会以这种方式调用吗?我的意思是调用我们需要的静态方法

"classname.methodname"

所以这里可以调用方法吗?

Ern*_*ill 7

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

有几种方法可以继续.一个是学习JNI以及如何编写实际使用它的库.以下是此规范的参考资料.但是,使用C#执行此操作会增加另一层复杂性.

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