2

我有我想通过 JNI 访问的本机函数声明,并且我有包含所有类声明的 DLL。

我没有完整的头文件及其依赖项,但我有包含所有信息的 DLL。

是否可以使用 SWIG 创建一个仅具有 DLL 和函数声明的 JNI 接口?

另请参阅:SWIG CYGWIN DLL 链接,这是一个非常相似的问题。

4

1 回答 1

1

除非您能从 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 Teat_foo(foo*)
6bec128c T make_foo()

所以我可以推断出包装这些的 SWIG 模块可能看起来像:

%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!

您仍然需要构建足够的标头以允许生成的包装器进行编译。

于 2012-05-10T10:11:47.570 回答