2
我有我想通過JNI 訪問的本地函數聲明,並且我擁有持有所有類聲明的DLL。帶有DLL和聲明的SWIG JNI接口只有
我沒有完整的頭文件及其依賴關係,但我確實擁有包含所有信息的DLL 。
是否可以創建一個使用SWIG 只有DLL和函數聲明的JNI接口?
另請參閱:SWIG CYGWIN DLL linking這是一個非常類似的問題。
我有我想通過JNI 訪問的本地函數聲明,並且我擁有持有所有類聲明的DLL。帶有DLL和聲明的SWIG JNI接口只有
我沒有完整的頭文件及其依賴關係,但我確實擁有包含所有信息的DLL 。
是否可以創建一個使用SWIG 只有DLL和函數聲明的JNI接口?
另請參閱:SWIG CYGWIN DLL linking這是一個非常類似的問題。
你不能這樣做,除非你可以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!
你仍然需要構造一個頭的,足以使生成的包裝來雖然編譯。
嗯..我想這對我來說很難,因爲dll中有很多類型和依賴關係和類型。 –