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

标签 java c++ dll visual-studio-2015 swig

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

但在所有示例中都没有使用预编译的 DLL 和/或 Java 和/或 Visual Studio (2015)。当使用自己的 cpp 文件进行实现时(并且不使用外部 DLL,实现 header )一切正常(编译为单个 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 包含并且不使用预编译头
  6. 将 example_wrap.cxx 编译成 example.lib(对吗?)
  7. 像教程中那样设置项目设置(没有 clr,添加 java-includes,没有预编译头文件)
  8. 现在创建整个项目失败,并在 example_wrap.obj 中出现链接错误 LNK2019。

有人可以帮助我吗?

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

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

最佳答案

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

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

关于java - 在 Java 中使用已编译的 DLL 与 SWIG 和 Visual Studio 2015,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41847562/

相关文章:

java - 如何消除 IBM RAD 8/Eclipse 中的错误?

java - 如何在 Eclipse RCP ImageDescriptor 中使用动画 GIF

android - 无法在 Android 8 Oreo 上执行 "system"命令

c++ - 如何在一个 DLL 中定义运行时常量并在另一个 DLL 中使用它们?

c# - 在 C++ 中调用 C# dll

java - 如何使用 JDBC 从 List<Object>(嵌套)插入数据库

java - 单选按钮未出现在 JFrame 中

c++ - 尝试使用文本文件初始化多个结构变量

c++ - 如何读取 C++ 中的嵌入式代码签名?

dll - AfxGetInstanceHandle()在常规mfc dll中返回null