问题背景:Java调用C++,通常推荐用JNI(Java Native Interface)http://t.csdnimg.cn/kjOND
但是调用时每调用一个C++方法都需要在Java程序中增加,不符合设计时的开放封闭原则,业务一边程序就要修改
public class CallCPlus extends CallImp {
@Override
public void execute() {
}
public native void test(String url);
static {
System.load("C:\\Users\\111\\Desktop\\flowable\\ruoyi-flowable-plus-0.8.X\\ruoyi-flowable-plus-0.8.X\\ruoyi-flowable\\src\\main\\java\\com\\ruoyi\\flowable\\external\\CPlus\\Call.dll");
}
}
解决方法:利用Python作为中间桥梁Bridge
1.Java调用Python
public void callpython(String interpreter, String py_url, String args,String methodName,String returnType){
Process proc;
String[] cmds = new String[]{interpreter, py_url,args,methodName,returnType};
try {
proc = Runtime.getRuntime().exec(cmds);// 执行py文件
//用输入输出流来截取结果
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
2.Python调用C++
def callCPlus(methodName,args,returnType,source):
pDll = CDLL(source)
# 获取解析的参数
Arr=parseArgs(args)
# 获取指定方法名的函数指针
myfun = getattr(pDll, methodName)
#参数类型
myfun.argtypes = Arr[1]
# 返回值类型
myfun.restype = parseReturn(returnType)
#调用 C++ 函数,将参数值解压出来,类似于js中的...
result=myfun(*Arr[0])
print(result)
注明:方法名、参数、返回值和dll路径这些函数元数据存放至注册中心(数据库)中
解决了:需要增添方法时,只需将方法的元数据注册到注册中心,无需修改程序