SWIG JNI接口仅包含DLL和声明

时间:2012-05-10 10:07:47

标签: dll header java-native-interface swig

我有我想通过JNI访问的本机函数声明 我有DLL持有所有类声明。

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

是否可以使用SWIG创建JNI接口 只有DLL和函数声明?

另见:SWIG CYGWIN DLL linking这是一个非常类似的问题。

1 个答案:

答案 0 :(得分: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()

所以我可以推断出用于包装它们的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!

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