如何通过 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