在 Java 中使用已编译的 DLL 与 SWIG 和 Visual Studio 2015

Using a compiled DLL in Java with SWIG and Visual Studio 2015

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

但在所有示例中都没有使用预编译 DLL and/or Java and/or Visual Studio (2015)。当使用自己的 cpp 文件进行实现时(并且不使用外部 DLL,实现 header)一切正常(编译为单个 DLL 并从 Java 调用)。

那么我想要什么: 有一个预编译的 DLL (example.dll),header (example.h) 和SWIG header 文件 (example.i)。将所有内容编译成 "wrapper DLL",在 Java 中加载这个并访问预编译的 DLL (example.dll)。

我的详细步骤:

  1. 新建 VS class 库项目
  2. 添加h和i文件
  3. 为 i 文件添加自定义构建步骤(如示例中所示)
  4. Java 个文件并生成 example_wrap.cxx 个文件
  5. 添加 example_wrap.cxx,添加 Java 包含并且不使用预编译 headers
  6. 编译example_wrap.cxx到example.lib(对吗?)
  7. 像教程中那样设置项目设置(没有 clr,添加 java-includes,没有预编译 headers)
  8. 现在创建整个项目失败,链接错误 LNK2019 example_wrap.obj。

有人可以帮助我吗?

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

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

基本上您需要"forward" 调用外部库。 IE。从那里将符号导入到包装器库中,并使用外部 DLL 库文件 link。

如果您没有这样的 DLL 库文件,您需要创建它(例如 using some tool 从 DLL 创建库),或者加载外部 library/import 符号运行时 (LoadLibrary/GetProcAddress).

axalis 的回答绝对正确。这里有一些细节:

  1. 添加example.cpp
  2. 使用 LoadLibrary 加载预编译的 DLL (example.dll) 并保存引用
  3. 使用 GetProcAddress 从那里加载方法并为每个方法保存一个引用
  4. 为每个刚刚调用之前加载的方法的方法写一个"implemantation"
  5. 编译 link 一切到 exampleWrap.dll 并将此 dll 加载到 Java 项目