Java调用C++的DLL设计!!!解耦实用!!!

发布时间:2024年01月24日

问题背景: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路径这些函数元数据存放至注册中心(数据库)中

解决了:需要增添方法时,只需将方法的元数据注册到注册中心,无需修改程序

文章来源:https://blog.csdn.net/m0_55049655/article/details/135785883
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。