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

时间:2015-05-23 00:51:14

标签: c++ c plugins shared-libraries swig

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

1 个答案:

答案 0 :(得分:1)

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

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

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

原始库接口文件:

%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 

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

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

%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