我有个图书馆。它是通过大口而动的。我想要创建一个插件来扩展它。插件需要一个已经包装好的库中的类来运行类似于void init( oldT old);的东西。库由Java和c#使用。现在这个插件也将从那里使用。库和插件是分开的dll。在为插件创建绑定时,我已经包装好了oldT类型。
发布于 2015-05-23 13:28:23
您要在插件的%import文件中查找.i。您需要从现有库中获得(或伪造)原始.i文件。
基于一个简单的头文件的针对Java (但不特定于Java)的MCVE:
#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类型生成了oldT和一些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
Hellohttps://stackoverflow.com/questions/30407792
复制相似问题