0
我有一個圖書館。它是通過SWIG包裝的。我想創建一個插件來擴展它。插件需要已包裝庫中的類運行類似void init(oldT old);
。庫是從Java和C#中使用的。現在這個插件也將被使用。庫和插件是單獨的dll的。如何創建SWIG,我已經有創建綁定插件的oldT
類型包裝?如何通過SWIG創建已包裝庫的擴展?
我有一個圖書館。它是通過SWIG包裝的。我想創建一個插件來擴展它。插件需要已包裝庫中的類運行類似void init(oldT old);
。庫是從Java和C#中使用的。現在這個插件也將被使用。庫和插件是單獨的dll的。如何創建SWIG,我已經有創建綁定插件的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
其中生成libexisting.so和一些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,但是我爲JNI做了這樣的事情。我創建了一個庫來映射套接字函數。只需創建所有方法,然後轉發任何需要轉換的參數。 – JavaProphet