如何从Java访问C ++库(DLL)的方法

时间:2013-02-05 11:13:45

标签: java dll

我有一个用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 64位和Java 7。

2 个答案:

答案 0 :(得分:2)

首先,您无法导出类方法并将其加载到java中。该名称将被破坏,java将不知道如何正确调用它。你需要做的就是把它分解成一个独立的功能。

之后:

正如已经指出的那样,请确保导出该功能。您可以使用以下两种方式之一导出。第一个是提到的,即使用__declspec(dllexport)。第二个是将它放入def文件中。

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

所以签名应该是这样的:

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

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

答案 1 :(得分:1)

我认为您的本机库需要提供C风格的界面,例如

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

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