您正在插件的 .i 文件中查找 %import。您需要拥有(或伪造)现有库中的原始 .i 文件。
一个基于简单头文件的面向 Java(但没有特定于 Java)的 MCVE:
#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
它为 oldT 类型生成了 libexisting.so 和一些 Java。
现在我们编写插件接口文件:
%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