0

我正在尝试生成一个我可以通过 JNA 从 java 访问的 dll。

我只是尝试一个简单的:

共产党:

void Initialize()
{
  std::cout<< "Hello World!";
}

iostream 也包括在内,编译后我得到: CreateDll.dll

通过 Visual Studio,我现在可以生成一个 *.dll。

我尝试像这样加载到Java中:

public class mainRoutine {
  public static void main(String[] args) {
    NativeWrapper INSTANCE = (NativeWrapper) Native.loadLibrary("CreateDll" , NativeWrapper.class);             
    INSTANCE.Initialize();
  }

  static {
    System.setProperty("jna.library.path", "C:\\workspace\\JNA");
  }
}

还有另一个接口:

导入 com.sun.jna.Library;

public interface NativeWrapper extends Library {
  void Initialize();
}

所以但是现在运行Java函数我得到了错误,

 java.lang.UnsatisfiedLinkError: 
  Error looking up function 'Initialize': 
   The specified procedure could not be found.

我错过了什么?

PS:我知道有很多主题,但是尝试了一天我还没有找到解决方案。请帮我。

4

3 回答 3

0

您需要导出和(如果使用 C++)取消装饰函数名称。

在 Windows 上,函数通常可用于导出__declspec(dllexport).

在任何平台上,为确保函数以不受管理的形式导出,您必须使用extern "C".

具体来说:

extern "C" void __declspec(dllexport) Initialize() { ... }

还有其他指定导出函数的方法,但这可能是最常见和最直接使用的方法。如果您使用extern "C",您的函数将类似于InitializeZ@ASDF@,其中编译器和链接器使用附加的垃圾字符来根据其调用签名使给定函数唯一可识别。

于 2012-05-04T16:24:53.673 回答
0

如果有一个类要实现怎么办?.h 文件如下所示:

namespace simpleDLLNS
{
    class simpleDLL
    {
    public:

       char giveVoidPtrGetChar(void* param);
       int giveIntGetInt(int a);
       void simpleCall(void);
       int giveVoidPtrGetInt(void* param);
    };
}

应该在哪里使用 extern "C" void __declspec(dllexport) ?我在实现功能时使用它。但是当我打开dll时,它看起来像这样:

?simpleCall@simpleDLL@simpleDLLNS@@QAEXXZ

于 2012-07-06T14:43:03.340 回答
0

您是否正在导出符号:

void _declspec(dllexport) Initialize()
{
  std::cout<< "Hello World!";
}
于 2012-05-04T16:14:40.330 回答