Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在基于JNI的Java应用程序中检测并(自动或手动)重新加载崩溃的DLL_Java_C_Crash_Java Native Interface - Fatal编程技术网

是否可以在基于JNI的Java应用程序中检测并(自动或手动)重新加载崩溃的DLL

是否可以在基于JNI的Java应用程序中检测并(自动或手动)重新加载崩溃的DLL,java,c,crash,java-native-interface,Java,C,Crash,Java Native Interface,我正在使用一个基于Java和C/C++的应用程序,两者之间的链接是JNI。C/C++被编译成DLL。因此,我们有以下Java源代码: System.loadLibrary(<product.DLL>); <Complete algorithm, filled with JNI calls> System.loadLibrary(); 我们经常在C/C++代码中出现崩溃,因此算法停止 为了处理这个问题,我可以在C/C++代码中输入异常处理,并将它们转发到Java代码中,

我正在使用一个基于Java和C/C++的应用程序,两者之间的链接是JNI。C/C++被编译成DLL。因此,我们有以下Java源代码:

System.loadLibrary(<product.DLL>);
<Complete algorithm, filled with JNI calls>
System.loadLibrary();
我们经常在C/C++代码中出现崩溃,因此算法停止

为了处理这个问题,我可以在C/C++代码中输入异常处理,并将它们转发到Java代码中,以便作为Java异常处理。这样,我可以避免崩溃,但有一个重要的问题:我的应用程序已经有30年的历史了,在这段时间里有几十个开发人员在开发它(±200万行源代码),换句话说,应用程序已经变得太大,无法在每个JNI调用上实现异常处理

因此,我开始思考:是否有可能做到以下几点:

System.loadLibrary(<product.DLL>);
try {
  <Complete algorithm, filled with JNI calls>
catch (Exception e) {
  System.out.println("An exception occured: " + e.getMessage());
  System.reloadLibrary(<product.DLL>);
}
System.loadLibrary();
试一试{
捕获(例外e){
System.out.println(“发生异常:+e.getMessage());
reloadLibrary();
}

一旦出现这样的问题,应用程序将继续进行下一个处理。我的第一个猜测是,我在这里太天真了,但即使如此:我的应用程序正在运行一系列数据,是否可能捕获崩溃并在Java源代码中的某个特定位置重新加载DLL?

当C/C++代码使进程崩溃时如果不重新启动进程,这是无法恢复的。我建议您使用一个Java进程启动第二个JVM来加载DLL,如果失败,请重试

您能透露库是什么吗?库是由我的公司创建的产品DLL,它不是通用DLL。崩溃是由内存损坏引起的-DLL已损坏。修复是不要忽视这个问题,再试一次——这是为了修复坏掉的代码。如果车轮每10分钟就从你的车上掉下来,你会(1)修复它,还是(2)修复它继续驾驶,每次车轮脱落时都要更换车轮?你的车轮不断脱落,你建议继续驾驶就可以了。@AndrewHenle:让我向你解释一下背景:我负责一个测试列表,检查我们的应用程序是否工作正常。此测试列表打开DLL一次并启动所有单独的测试,但如果软管测试失败(在破坏DLL的意义上),所有其他测试都不再执行。我意识到这是由于测试应用程序的错误设计(它应该在每次测试时加载DLL),但是您可以想象重新设计测试应用程序是一个大问题,因此我的问题是它是C++异常吗?(对于这个问题,是C还是C++?)请显示崩溃错误消息和一个最小的、完整的、可验证的例子。