2015-05-23 40 views
0

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

+0

我还没有使用SWIG,但是我为JNI做了这样的事情。我创建了一个库来映射套接字函数。只需创建所有方法,然后转发任何需要转换的参数。 – JavaProphet

回答

1

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