我正在使用基于Java和C / C ++的应用程序,两者之间的链接是JNI。 C / C ++被编译成DLL。所以,我们有以下Java源代码:
System.loadLibrary(<product.DLL>);
<Complete algorithm, filled with JNI calls>
我们经常在C / C ++代码中崩溃,因为算法停止了。
为了处理这个问题,我可以在C / C ++代码中输入异常处理,并将它们转发到Java代码,以便作为Java异常处理。像这样,我可以避免崩溃,但有一个重要的问题:我的应用程序大约有三十年的历史,在这段时间内已经有数十个开发人员在处理它(大约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>);
}
一旦出现这样的问题,应用程序就会进一步进行下一个处理。我的第一个猜测是我在这里太天真了,但即便如此:我的应用程序正在运行一系列数据,是否有可能捕获崩溃并在Java源代码中的特定位置重新加载DLL?
答案 0 :(得分:0)
当C / C ++代码崩溃时,如果不重新启动进程,则无法恢复。我建议您有一个Java进程启动第二个JVM加载DLL,如果失败,请再试一次