如何从Java访问C ++库(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。

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

之后:

如前所述,请确保导出该function。 您可以使用以下两种方法之一导出。 第一个是提到的,即使用__declspec(dllexport)。 第二个是将它放入def文件中。

此外,请确保将其标记为extern“C”,否则名称将被破坏。 所有细节都在这里: 使用dllexport从DLL导出函数

所以签名应该是这样的:

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

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

我认为你的本地库需要提供一个C风格的界面

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

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