0
我有一个图书馆。它是通过SWIG包装的。我想创建一个插件来扩展它。插件需要已包装库中的类运行类似void init(oldT old);
。库是从Java和C#中使用的。现在这个插件也将被使用。库和插件是单独的dll的。如何创建SWIG,我已经有创建绑定插件的oldT
类型包装?如何通过SWIG创建已包装库的扩展?
我有一个图书馆。它是通过SWIG包装的。我想创建一个插件来扩展它。插件需要已包装库中的类运行类似void init(oldT old);
。库是从Java和C#中使用的。现在这个插件也将被使用。库和插件是单独的dll的。如何创建SWIG,我已经有创建绑定插件的oldT
类型包装?如何通过SWIG创建已包装库的扩展?
您正在寻找插件的.i文件中的%import
。您需要从现有的库中获取(或伪造)原始.i文件。
一个MCVE基于一个简单的头文件针对Java的(但没有具体到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
其中生成libexisting.so和一些Java的oldT
类型。
现在我们写的插件接口文件:
%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
我还没有使用SWIG,但是我为JNI做了这样的事情。我创建了一个库来映射套接字函数。只需创建所有方法,然后转发任何需要转换的参数。 – JavaProphet