基本需求
利用java应用程序:输入两个字符串参数和一个整型参数,输出一个字符串结果。在C++中调用java程序包,获取输出的字符串。
实现方法
- java提供了JNI方法支持C++和java的相互调用,但是简单的调用需求,不想费劲去配置JNI的头文件和静态库。
- C或者C++提供了System(),WinExec()等方法来调用CMD命令。但是只有通过管道pipe()的方法才能获取java应用程序输出的结果。
- 关键代码
#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;
}
}