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

Posted

技术标签:

【中文标题】通过 SWIG 和 Visual Studio 2015 在 Java 中使用已编译的 DLL【英文标题】:Using a compiled DLL in Java with SWIG and Visual Studio 2015 【发布时间】:2017-01-25 09:15:10 【问题描述】:

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

How to create a DLL with SWIG from Visual Studio 2010 http://www.swig.org/Doc3.0/Java.html SWIG JNI Interface with DLL and declarations only

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

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

我的详细步骤:

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

有人可以帮助我吗?

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

    添加example.cpp 使用 LoadLibrary 加载预编译的 DLL (example.dll) 并保存参考 使用 GetProcAddress 从那里加载方法并为每个方法保存一个引用 为您刚刚调用之前加载的方法的每个方法编写一个“实现” 编译并将所有内容链接到 exampleWrap.dll 并将此 dll 加载到 Java 项目中

【讨论】:

以上是关于通过 SWIG 和 Visual Studio 2015 在 Java 中使用已编译的 DLL的主要内容,如果未能解决你的问题,请参考以下文章

swig 和使用 Visual Studio 2017 命令行构建项目

Nodejs in Visual Studio Code 04.Swig模版

尝试获取一个 C 库并使用 swig 将其公开给 Windows 中的 Python。关于静态与动态以及使用 Visual Studio for swig 的问题

依赖项更改时 Visual Studio 运行自定义构建工具

如何通过VIsual Studio安装程序修改VS2017?

Visual Studio 2017不构建项目