java - 在java中访问dll方法

标签 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");
        }
    }
}

在此之后,我将生成的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"

那么这里可以调用方法吗?

最佳答案

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

您可以通过多种方式进行操作。一种是了解 JNI 以及如何编写实际使用它的库。 Here是对此的规范引用。不过,使用 C# 执行此操作会增加另一层复杂性。

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

关于java - 在java中访问dll方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675179/

相关文章:

java - Spring Boot 集成测试 - 在应用程序上下文启动之前模拟 @Service?

c - 用 __stdcall 替换 FAR 和 PASCAL

c - 如果调试中途停止,在 Windows C 控制台应用程序中运行 JVM 会变成僵尸

java - JNI java.lang.UnsatisfiedLinkError

Java JNI C 程序适用于 Mingw32,但不适用于 Cygwin64

Java AWT 需要 X11,如何使用 xvfb (ubuntu 14.04)

java - APDU读文件java卡程序

java - 与 ObjectMapper 一起使用注释 Mixins 时出错

c# - 32 位 DLL 未正确构建

c++ - 如何在 C++ Builder 6 中从应用程序源创建 dll?