【问题标题】:how to access a method of C++ library (DLL) from Java如何从 Java 访问 C++ 库 (DLL) 的方法
【发布时间】:2013-01-20 07:13:12
【问题描述】:

我有一个用 C++ 编写的库(实际上是一个 Firefox 插件 xyz.dll),我需要从 Java 访问它的方法。

public class AccessLibrary {
    public interface Kernel32 extends Library {
        public void showVersion();
    }

    public static void main(String[] args) {
        Kernel32 lib = (Kernel32) Native.loadLibrary("xyz.dll", Kernel32.class);
        lib.showVersion();
    }
}

执行时出现如下错误:

java -jar dist/accessLibrary.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function  'showVersion': The specified procedure could not be found.

在原生库源码中,方法是这样定义的

void CPlugin::showVersion() {
    /* ... */
}

我对 Java 很陌生。可能是我缺少一些基本的东西。调查了类似的问题,但没有一个能解决我的问题。

忘了说我使用的是 Windows 7 64bit 和 Java 7。

【问题讨论】:

    标签: java dll


    【解决方案1】:

    首先,您不能导出类​​方法并将其加载到 java 中。这个名字会被破坏,java 不知道如何正确地调用它。您需要做的就是将其分解为一个单独的函数。

    之后:

    如前所述,确保导出函数。您可以使用以下两种方式之一进行导出。第一个就是提到的,就是使用__declspec(dllexport)。二是放到def文件中。

    此外,请确保将其标记为 extern "C",否则名称将被破坏。所有细节都在这里:Exporting functions from a DLL with dllexport

    所以签名应该是这样的:

    extern "C" __declspec(dllexport) void showVersion () {
    }
    

    最后,depends工具可以在这里下载:http://www.dependencywalker.com/

    【讨论】:

      【解决方案2】:

      我认为你的原生库需要提供 C 风格的接口,例如

      __declspec( dllexport ) void showVersion() {
        /* ... */
      }
      

      理想情况下,使用depends.exe(可通过 Windows SDK 获得)查看您的 DLL,您将看到您的 DLL 是否提供了正确的函数导出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多