当前位置: 首页 > 知识库问答 >
问题:

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

笪建章
2023-03-14

我有一个库。它是通过SWIG进行包装的。我想创建一个插件来扩展它。插件需要一个来自已经包装的库的类来运行具有类似val init(oldT old);的东西。库从Java和c#中使用。现在这个插件也将从那里使用。库和插件是分开的dll的。如何高SWIG,我已经有那个oldT类型在创建插件绑定时进行包装?

共有1个答案

有骏祥
2023-03-14

您正在插件的. 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 

这就产生了libexisting。还有一些Java用于oldT类型。

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

%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
 类似资料:
  • 问题内容: 我有用swig包装的类的C 代码。我无法修改代码或包装。在python中,我具有使用ctypes的指向所述C 类实例的指针。如何围绕该指针创建一个Swig包装器? 我知道swig对象拥有一个’this’属性,该属性在内部指向包装的对象,但是我找不到一种将其设置为我手头的指针的方法。 谢谢您的帮助! 问题答案: 您 可以 执行此操作,但是这需要大量工作,并且解决使ctypes或SWIG接

  • 问题内容: 我正在使用SWIG从Java访问C ++代码。 公开非常量引用传递的std :: string参数的最简单方法是什么? 我有参考暴露为Java数组传递原语,感谢typemaps.i,和s ^暴露,感谢std_string.i。但是非const std :: string&被公开为不透明指针类型。 当前: 期望的: 更新 :我找到 了 解决方案,如下所述。但是,它花费了超过几秒钟的时间。

  • 在我的Spring项目中,我使用HiberNate将我的实体类导出到以前创建的数据库。但是这需要最终用户知道如何在数据库管理器系统中创建数据库(目前我正在使用Postgreql)。 是否有任何方法,只要给定安装postgreql的机器(以及第一次运行应用程序时提供的用户名和密码),HiberNate在服务器中创建一个新数据库(如果它不存在)?

  • 现在php已经可以在你的应用中访问了, 是时候让它做⼀些事情了. 本章剩下的核心就是围绕着在这个测试应用框架中重新创建cli sapi展开的. 很简单, cli二进制程序最基础的功能就是在命令行指定⼀个脚本的名字, 由php对其解 释执行. 用下面的代码替换你的embed1.c的内容就在你的应用中实现了cli. #include <stdio.h> #include <sapi/embed/php

  • 每个项目都是一个扩展包 一旦你的目录有一个 composer.json 文件,这个目录就是一个包。当你给一个项目添加一个 require 依赖时, 此时你正在创建一个依赖于其他包的包。 项目和扩展包唯一不同之处在于,项目是一个没有名称的包。 为了使该包可安装,你需要指定一个名称, 通过在 composer.json 中添加 name 属性: { "name": "acme/hello-wo

  • 问题内容: 我已经看到了很多类似的问题,但是还没有找到解决我特定问题的方法。我正在尝试SWIGify一些使用std :: function的C ++ 11代码,因此可以在Java应用程序中使用它。 我遇到了这样的共享指针: 并使用shared_ptr指令成功处理了它们,如下所示: 我遇到了像这样的共享指针向量: 并使用如下模板成功处理了它们: 现在我有一个这样的方法: 而且我无法让SWIG正确包装