如何解决C++ - CreateJVM 卡在 waitForFinished() 之后的所有 QProcess 调用
我的 C++ Qt 应用程序代码的快速概览(为了便于阅读而进行了简化)。
- 使用 QProcess 进行进程外调用
- 通过JNI调用java类
- 再次使用 QProcess 进行进程外调用
问题是在 (2) 之后的任何 QProcess 调用都没有结束(卡在 waitForFinished)。我相信应用程序没有收到 SIGCHLD 并且被 JVM 困住了。
但是,如果我在任何 QProcess 调用之前先创建 JVM,那么 JVM 之后的所有 QProcess 调用都可以工作。
总而言之,
QProcess() -> invokeJNI() -> QProcess == 卡在第二个 QProcess'waitForFinished()
invokeJNI() -> QProcess ->QProcess .. == WORKS!
void invokeQProcess(int id) {
QProcess process;
QString program = "/sbin/md5";
QStringList args;
args << "/tmp/tempFile.txt";
process.start(program,args);
if (!process.waitForFinished(-1)) {
QString output(process.readAllStandardOutput());
qDebug() << id << " QProcess failed with exit code -1 " << output;
return;
}
QString output(process.readAllStandardOutput());
qDebug() << id << " QProcess succeeded with output - " << output;
}
void invokeJNI() {
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=."
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
JavaVM *jvm;
JNIEnv *env;
JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
jclass sampleClass = env->FindClass("SampleClass");
jmethodID method = env->GetStaticMethodID(sampleClass,"main","([Ljava/lang/String;)V");
env->CallStaticVoidMethod(sampleClass,method,objArray);
jvm->DestroyJavaVM();
}
int main() {
invokeQProcess(1);
invokeJNI();
invokeQProcess(2);
return 0;
}
public class SampleClass {
public static void main(String[] args) {
List<String> command = new ArrayList<String>();
command.add("echo");
command.add("HelloJava");
ProcessBuilder pb = new ProcessBuilder(command);
process = pb.start();
try {
process.waitFor();
} catch (InterruptedException e) {
process.destroy();
}
}
}
设置:Qt 5.12 | OpenJDK 11.0.5 | Win 和 macOS 中的问题
编辑: 仅当 JNI 调用中的 java 方法内部有进程外调用时(我使用的是 ProcessBuilder),问题才会出现在第一个序列中。 更新了 JNI 调用并添加了 Java 类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。