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