C++调用java应用程序

基本需求

利用java应用程序:输入两个字符串参数和一个整型参数,输出一个字符串结果。在C++中调用java程序包,获取输出的字符串。

实现方法

  1. java提供了JNI方法支持C++和java的相互调用,但是简单的调用需求,不想费劲去配置JNI的头文件和静态库。
  2. C或者C++提供了System(),WinExec()等方法来调用CMD命令。但是只有通过管道pipe()的方法才能获取java应用程序输出的结果。
  3. 关键代码
#include <stdlib.h>
#include <stdio.h>
#include "QFile"
	{
		QString wkt0 = g0->asWkt();
		QgsGeometry gg1 = geometryFromGeos(geomUnion);//其他与执行command无关的函数
		QString wkt1 = gg1.asWkt();
		//我这里java环境没配置好,直接取绝对路径
		//@echo off只是为了在DOS窗口中不显示command信息
		//注意:路径中有空格,必须用""包含起来
		QString cmd =QStringLiteral( "@echo off\n \"C:/Program Files/Java/jdk-16.0.2/bin/java.exe\" -jar C:/git/test1-1.0-SNAPSHOT-jar-with-dependencies.jar \"%1\" \"%2\" 4526").arg(wkt0,wkt1);
		//bug:把执行jar的命令写入脚本中执行可以取到计算结果,而直接执行命令则获取不到,而直接执行其他类似于"ipconfig"、"wmic cpu get processorid"等,这类命令又可以正确获取到输出结果。原因未知。
		QFile wfile("C:/c/echo.bat");
		wfile.open(QIODevice::WriteOnly | QIODevice::Text);
		wfile.write(cmd.toLocal8Bit().data());
		wfile.flush();
		wfile.close();
		QString rres;
		FILE* fp;
		//通道中执行脚本,windows系统中用的是_popen
		if ((fp = _popen("C:/c/echo.bat"/*cmd.toStdString().c_str()*/, "r")) != NULL)
		{
			QFile file;
			file.open(fp, QIODevice::ReadOnly);
			//获取jar的计算结果
			rres = file.readAll();
			file.close();
			if (feof(fp))
			{
				qDebug() << _pclose(fp);
			}
			else
			{
				qDebug() << "error1";
			}
		}
		else
		{
			qDebug() << "error2";
		}
		if (!rres.isEmpty())
		{
			//对读取结果的应用
			res = QgsGeometry::fromWkt(rres);
			return res;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值