我有一个图书馆。它是通过 SWIG 封装的。我想创建一个插件来扩展它。插件需要已包装库中的类才能运行,具有类似 void init( oldT old);
的内容。 Java 和 C# 使用库。现在这个插件也将从那里使用。库和插件是独立的 dll。在为插件创建绑定(bind)时,如何确定我已经封装了 oldT
类型的 SWIG?
最佳答案
您正在寻找%import
在插件的 .i 文件中。您需要拥有(或伪造)现有库中的原始 .i 文件。
基于简单头文件的针对 Java 的 MCVE(但没有特定于 Java):
#ifndef EXISTING_H
#define EXISTING_H
struct oldT {
};
#endif
原始库接口(interface)文件:
%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。
现在我们编写插件接口(interface)文件:
%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
关于c++ - 如何通过 SWIG 创建已包装库的扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57215071/