通过SWIG和Visual Studio 2015在Java中使用编译的DLL

通过SWIG和Visual Studio 2015在Java中使用编译的DLL,java,c++,dll,visual-studio-2015,swig,Java,C++,Dll,Visual Studio 2015,Swig,我有一个已编译的DLL(C/C++),我必须在Java中使用它。所以我想使用SWIG创建一个包装器。我遵循了所有教程,如: 但在所有示例中,未使用预编译DLL和/或Java和/或Visual Studio(2015)。当使用自己的cpp文件进行实现时(不要使用外部DLL,实现头文件),一切正常(编译到单个DLL并从Java调用) 那么我想要什么:拥有一个预编译的DLL(example.DLL)、它的头文件(example.h)和SWIG头文件(example.I)。将所有内容编译为“包

我有一个已编译的DLL(C/C++),我必须在Java中使用它。所以我想使用SWIG创建一个包装器。我遵循了所有教程,如:

但在所有示例中,未使用预编译DLL和/或Java和/或Visual Studio(2015)。当使用自己的cpp文件进行实现时(不要使用外部DLL,实现头文件),一切正常(编译到单个DLL并从Java调用)

那么我想要什么:拥有一个预编译的DLL(example.DLL)、它的头文件(example.h)和SWIG头文件(example.I)。将所有内容编译为“包装器DLL”,用Java加载此DLL并访问预编译的DLL(example.DLL)

我的详细步骤:

  • 新VS类库项目
  • 添加h和i文件
  • 为i文件添加自定义构建步骤(如示例中所示)
  • 生成Java文件和示例_wrap.cxx文件
  • 添加示例_wrap.cxx,添加Java包含,不使用预编译头
  • 将example_wrap.cxx编译为example.lib(对吗?)
  • 像教程中那样设置项目设置(无clr、添加java包含、无预编译头)
  • 现在,创建整个项目失败,在示例_wrap.obj中出现链接错误LNK2019
  • 有人能帮我吗

    我也没有得到:结果将是“example.dll”。我必须在Java中使用这个DLL(使用System.load/loadLibrary)。此SWIG DLL如何访问包含所有逻辑的“原始”example.DLL

    使用Python而不是Java会导致相同的故障(LNK2019-未解析的外部符号)。

    基本上,您需要将调用“转发”到外部库。也就是说,将符号从那里导入包装器库,并与外部DLL库文件链接

    如果DLL没有这样的库文件,则需要创建它(例如,从DLL创建库),或者在运行时加载外部库/导入符号(
    LoadLibrary
    /
    GetProcAddress
    )。

    基本上需要将调用“转发”到外部库。也就是说,将符号从那里导入包装器库,并与外部DLL库文件链接


    如果DLL没有这样的库文件,则需要创建它(例如,从DLL创建库),或者在运行时加载外部库/导入符号(
    LoadLibrary
    /
    GetProcAddress
    )。

    axalis的回答绝对正确。以下是一些细节:

  • 添加example.cpp
  • 使用LoadLibrary加载预编译的DLL(example.DLL)并保存引用
  • 使用GetProcAddress从那里加载方法,并为每个方法保存一个引用
  • 为每个方法编写一个“implemantation”,您只需调用之前加载的方法即可
  • 编译所有内容并将其链接到exampleWrap.dll,然后将此dll加载到Java项目中

  • 阿克萨利斯的回答绝对正确。以下是一些细节:

  • 添加example.cpp
  • 使用LoadLibrary加载预编译的DLL(example.DLL)并保存引用
  • 使用GetProcAddress从那里加载方法,并为每个方法保存一个引用
  • 为每个方法编写一个“implemantation”,您只需调用之前加载的方法即可
  • 编译所有内容并将其链接到exampleWrap.dll,然后将此dll加载到Java项目中