如何通过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