在 Java 中使用已编译的 DLL 与 SWIG 和 Visual Studio 2015
Using a compiled DLL in Java with SWIG and Visual Studio 2015
我有一个已编译的 DLL (C/C++),我必须在 Java 中使用它。所以我想使用 SWIG 来创建一个包装器。我遵循了所有教程,例如:
- 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 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)。
我的详细步骤:
- 新建 VS class 库项目
- 添加h和i文件
- 为 i 文件添加自定义构建步骤(如示例中所示)
- Java 个文件并生成 example_wrap.cxx 个文件
- 添加 example_wrap.cxx,添加 Java 包含并且不使用预编译 headers
- 编译example_wrap.cxx到example.lib(对吗?)
- 像教程中那样设置项目设置(没有 clr,添加 java-includes,没有预编译 headers)
- 现在创建整个项目失败,链接错误 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 的回答绝对正确。这里有一些细节:
- 添加example.cpp
- 使用 LoadLibrary 加载预编译的 DLL (example.dll) 并保存引用
- 使用 GetProcAddress 从那里加载方法并为每个方法保存一个引用
- 为每个刚刚调用之前加载的方法的方法写一个"implemantation"
- 编译 link 一切到 exampleWrap.dll 并将此 dll 加载到 Java 项目
我有一个已编译的 DLL (C/C++),我必须在 Java 中使用它。所以我想使用 SWIG 来创建一个包装器。我遵循了所有教程,例如:
- 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 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)。
我的详细步骤:
- 新建 VS class 库项目
- 添加h和i文件
- 为 i 文件添加自定义构建步骤(如示例中所示)
- Java 个文件并生成 example_wrap.cxx 个文件
- 添加 example_wrap.cxx,添加 Java 包含并且不使用预编译 headers
- 编译example_wrap.cxx到example.lib(对吗?)
- 像教程中那样设置项目设置(没有 clr,添加 java-includes,没有预编译 headers)
- 现在创建整个项目失败,链接错误 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 的回答绝对正确。这里有一些细节:
- 添加example.cpp
- 使用 LoadLibrary 加载预编译的 DLL (example.dll) 并保存引用
- 使用 GetProcAddress 从那里加载方法并为每个方法保存一个引用
- 为每个刚刚调用之前加载的方法的方法写一个"implemantation"
- 编译 link 一切到 exampleWrap.dll 并将此 dll 加载到 Java 项目