2012-05-10 34 views
2

我有我想通過JNI 訪問的本地函數聲明,並且我擁有持有所有類聲明的DLL。帶有DLL和聲明的SWIG JNI接口只有

我沒有完整的頭文件及其依賴關係,但我確實擁有包含所有信息的DLL 。

是否可以創建一個使用SWIG 只有DLL和函數聲明的JNI接口?

另請參閱:SWIG CYGWIN DLL linking這是一個非常類似的問題。

回答

1

你不能這樣做,除非你可以guess enough information from the DLL能夠重建(可能是部分)頭文件。

它需要包含有關您所關心的功能(並非全部)的信息以及您關心的類型(不一定都是全部,但您需要知道每個功能的名稱功能)。

這樣就可以像平常一樣構建模塊文件。你可以根據它是C++還是C來猜測/推斷一些信息 - 如果它是C++,那麼錯誤的名稱會告訴你大部分你需要知道的輸入內容,而不是返回類型。


正如我編譯一個例子:使用

class foo {}; 

foo *make_foo() { return new foo; } 

void eat_foo(foo*) {} 

void frobinate_two_foos(foo*,foo*) {} 

作爲DLL:

i586-mingw32msvc-g++ -shared -Wall -Wextra original.cc -o test.dll

從我可以看到在DLL中的符號通過執行:

i586-mingw32msvc-nm test.dll|i586-mingw32msvc-c++filt

有趣的是:

 
6bec1286 T frobinate_two_foos(foo*, foo*) 
6bec1280 T eat_foo(foo*) 
6bec128c T make_foo() 

所以我可以推斷出了一大口模塊來包裝這些可能看起來像:

%module reversed 

class foo; // Nothing more known 

foo *make_foo(); 

void frobinate_two_foos(foo*,foo*); // Return type guessed 

// ignored eat_foo, I don't know what that does at all! 

你仍然需要構造一個頭的,足以使生成的包裝來雖然編譯。

+0

嗯..我想這對我來說很難,因爲dll中有很多類型和依賴關係和類型。 –