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

时间:2017-01-25 09:15:11

标签: 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”,在Java中加载此文件并访问预编译的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. 现在创建整个项目失败,并在example_wrap.obj中链接错误LNK2019。
  9. 有人能帮助我吗?

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

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

2 个答案:

答案 0 :(得分:0)

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

如果你没有DLL的这样一个lib文件,你需要创建它(例如using some tool来自DLL的create lib),或者在运行时加载外部库/导入符号({{ 1}} / LoadLibrary)。

答案 1 :(得分:0)

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

  1. 添加example.cpp
  2. 使用LoadLibrary加载预编译的DLL(example.dll)并保存参考
  3. 使用GetProcAddress从那里加载方法并为每个方法保存一个引用
  4. 写一个"实现"对于每个只调用
  5. 之前加载的方法的方法
  6. 编译并将所有内容链接到exampleWrap.dll并在Java项目中加载此dll