是否可以在基于JNI的Java应用程序中检测并(自动或手动)重新加载崩溃的DLL
我正在使用一个基于Java和C/C++的应用程序,两者之间的链接是JNI。C/C++被编译成DLL。因此,我们有以下Java源代码:是否可以在基于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代码中,
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++?)请显示崩溃错误消息和一个最小的、完整的、可验证的例子。