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

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

您正在寻找插件的.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