首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过SWIG创建已包装库的扩展?

问如何通过SWIG创建已包装库的扩展?
EN

Stack Overflow用户
提问于 2015-05-23 00:51:14
回答 1查看 388关注 0票数 0

我有个图书馆。它是通过大口而动的。我想要创建一个插件来扩展它。插件需要一个已经包装好的库中的类来运行类似于void init( oldT old);的东西。库由Java和c#使用。现在这个插件也将从那里使用。库和插件是分开的dll。在为插件创建绑定时,我已经包装好了oldT类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-23 13:28:23

您要在插件的%import文件中查找.i。您需要从现有库中获得(或伪造)原始.i文件。

基于一个简单的头文件的针对Java (但不特定于Java)的MCVE:

代码语言:javascript
复制
#ifndef EXISTING_H
#define EXISTING_H
struct oldT {
};
#endif

原始库接口文件:

代码语言:javascript
复制
%module existing

%{
#include "existing.h"
%}

%include "existing.h"

有了这些,我们就可以构建原始库了:

代码语言:javascript
复制
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。

现在我们编写插件接口文件:

代码语言:javascript
复制
%module plugin

%import "existing.i"
%{
#include "existing.h"
%}

%inline %{
  void plugin_init(struct oldT old) {
    printf("Hello\n");
  }
%}

这里的关键是使用%import引入,而不是为已经包装在您想要扩展的库中的组件生成包装器代码。

同样,我们可以编译如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public class run {
  public static void main(String[] argv) {
    System.loadLibrary("existing");
    System.loadLibrary("plugin");
    plugin.plugin_init(new oldT());
  }
}

我用它来编辑和运行:

代码语言:javascript
复制
javac run.java
LD_LIBRARY_PATH=. java run
Hello
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30407792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档