c++ - 如何通过 SWIG 创建已包装库的扩展?

标签 c++ c plugins shared-libraries swig

我有一个图书馆。它是通过 SWIG 封装的。我想创建一个插件来扩展它。插件需要已包装库中的类才能运行,具有类似 void init( oldT old); 的内容。 Java 和 C# 使用库。现在这个插件也将从那里使用。库和插件是独立的 dll。在为插件创建绑定(bind)时,如何确定我已经封装了 oldT 类型的 SWIG?

最佳答案

您正在寻找%import在插件的 .i 文件中。您需要拥有(或伪造)现有库中的原始 .i 文件。

基于简单头文件的针对 Java 的 MCVE(但没有特定于 Java):

#ifndef EXISTING_H
#define EXISTING_H
struct oldT {
};
#endif

原始库接口(interface)文件:

%module existing

%{
#include "existing.h"
%}

%include "existing.h"

有了这些,我们就可以构建原始库了:

swig2.0 -Wall -java existing.i 
gcc -Wall -Wextra -shared -o libexisting.so -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux existing_wrap.c 

它生成了 libexisting.so 和一些 oldT 类型的 Java。

现在我们编写插件接口(interface)文件:

%module plugin

%import "existing.i"
%{
#include "existing.h"
%}

%inline %{
  void plugin_init(struct oldT old) {
    printf("Hello\n");
  }
%}

这里的关键是使用 %import 引入,但不为已包装在要扩展的库中的组件生成包装器代码。

我们可以再次编译它:

swig2.0 -Wall -java plugin.i
gcc -Wall -Wextra -shared -o libplugin.so -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux plugin_wrap.c

(请注意,对于您的实际场景,您需要在某些情况下将其链接到现有库的共享库)

然后为了测试它,我编写了少量的 Java:

public class run {
  public static void main(String[] argv) {
    System.loadLibrary("existing");
    System.loadLibrary("plugin");
    plugin.plugin_init(new oldT());
  }
}

我编译并运行的:

javac run.java
LD_LIBRARY_PATH=. java run
Hello

关于c++ - 如何通过 SWIG 创建已包装库的扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57215071/

相关文章:

plugins - Joomla 插件未被调用

plugins - 猫头鹰旋转木马键盘导航

c++ - 什么是用 C++ 开发 Web 服务的好平台?

c++ - priority_queue 常量表达式

c++ - 将二进制值转换为十六进制值(32 位)

C vec3 结构体实现

c++ - vtable 存储在内存的哪个位置?

C fopen 写入失败,errno 为 2

C - 为什么我会遇到段错误?

apache-flex - 在 MAC 上哪里可以找到 IntelliJ IDEA 9.0 的 Flex 插件?