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

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

本文关键字:Java 编译 DLL Visual Studio 2015 SWIG      更新时间:2023-10-16

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

  • 如何使用Visual Studio 2010中的SWIG创建DLL
  • http://www.swig.org/Doc3.0/Java.html
  • 仅带DLL和声明的SWIG JNI接口

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

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

我的详细步骤:

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

有人能帮我吗?

我也没有得到:结果将是"example.dll"。我必须在Java中使用这个dll(带有System.load/loadLibrary)。这个SWIG dll如何访问"原始"example.dll以及里面的所有逻辑?

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

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

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

axalis的回答绝对正确。这里有一些细节:
  1. 添加example.cpp
  2. 使用LoadLibrary加载预编译的DLL(例如.DLL)并保存引用
  3. 使用GetProcAddress从那里加载方法,并为每个方法保存一个引用
  4. 为每个方法编写一个"implementation",只需调用之前加载的方法
  5. 编译并将所有内容链接到exampleWrap.dll,并在Java项目中加载此dll