2015-05-23 82 views
0

我有一個圖書館。它是通過SWIG包裝的。我想創建一個插件來擴展它。插件需要已包裝庫中的類運行類似void init(oldT old);。庫是從Java和C#中使用的。現在這個插件也將被使用。庫和插件是單獨的dll的。如何創建SWIG,我已經有創建綁定插件的oldT類型包裝?如何通過SWIG創建已包裝庫的擴展?

+0

我還沒有使用SWIG,但是我爲JNI做了這樣的事情。我創建了一個庫來映射套接字函數。只需創建所有方法,然後轉發任何需要轉換的參數。 – JavaProphet

回答

1

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