如何通过 SWIG 创建对已包装库的扩展?
How to create an extension to already wrapped library via SWIG?
我有一个图书馆。它通过 SWIG 包装。我想创建一个插件来扩展它。插件需要 class 从已经包装的库到 运行 有类似 void init( oldT old);
的东西。从 Java 和 c# 使用库。现在这个插件也将从那里使用。库和插件是单独的 dll。在为插件创建绑定时,我已经包装了 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
为 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
(请注意,对于您的真实场景,您在某些场景中需要 link 针对现有库的共享库)
然后为了测试它我写了少量 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 包装。我想创建一个插件来扩展它。插件需要 class 从已经包装的库到 运行 有类似 void init( oldT old);
的东西。从 Java 和 c# 使用库。现在这个插件也将从那里使用。库和插件是单独的 dll。在为插件创建绑定时,我已经包装了 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
为 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
(请注意,对于您的真实场景,您在某些场景中需要 link 针对现有库的共享库)
然后为了测试它我写了少量 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