UnsatisfiedLinkError - 如何创建c ++ - DLL?

时间:2012-05-04 15:51:41

标签: java c++ dll jna

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

我只是尝试一个简单的:

CPP:

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

还有另一个界面:

import 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:我知道有很多主题,但尝试了一天我还没有找到解决方案。请帮帮我。

3 个答案:

答案 0 :(得分:0)

您是否导出符号:

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

答案 1 :(得分:0)

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

在Windows上,通常可以使用__declspec(dllexport)导出函数。

在任何平台上,为确保以非拼写形式导出函数,您必须使用extern "C"

具体做法是:

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

还有其他方法可以指定导出的函数,但这可能是最常用和最简单的方法。如果你使用extern "C",你的函数将看起来像InitializeZ@ASDF@,其中编译器和链接器使用额外的乱码字符来使给定的函数唯一可识别根据其主叫签名。

答案 2 :(得分: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