【问题标题】:How to create an extension to already wrapped library via SWIG?如何通过 SWIG 创建对已包装库的扩展?
【发布时间】:2015-05-23 00:51:14
【问题描述】:

我有一个图书馆。它是通过 SWIG 包装的。我想创建一个插件来扩展它。插件需要一个来自已包装库的类才能运行,具有类似void init( oldT old); 的内容。库用于 Java 和 c#。现在这个插件也将从那里使用。库和插件是独立的 dll。在为插件创建绑定时,如何提高我已经包装了 oldT 类型的 SWIG?

【问题讨论】:

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

标签: c++ c plugins shared-libraries swig


【解决方案1】:

您正在插件的 .i 文件中查找 %import。您需要拥有(或伪造)现有库中的原始 .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 

它为 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

(请注意,对于您的真实场景,您需要在某些场景中将其与现有库的共享库链接)

然后为了测试它,我写了少量的 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

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2016-06-24
    相关资源
    最近更新 更多