我将共享库PC交叉编译为带有-fexceptions标志的NDK(llvm编译器)并测试它从目标android设备上的可执行文件动态加载。
在库代码中,我有异常和处理程序,它们不在库外,所有try-catch都在里面。
在我的测试可执行文件中,我使用dlopen(... RTLD_NOW)加载库,并且try-catch正常工作。 (我实际上尝试了不同的标志,但无论如何处理异常都很好)
然后我有另一个第三方可执行文件调用我的库。我认为我的库加载方式和我一样,但不确定。但这次例外不起作用,它会崩溃
在库中测试代码(不是API extern" C"函数)
logcat("1");
try {
throw 1;
} catch (...) {
logcat("2");
}
" 2"总是发生在我的可执行文件中,永远不会发生在第三方可执行文件中(崩溃发生)
我还检查了设备上的malloc-debug标志,它没有设置(在build.prop中)
我的问题是:有没有办法让第三方可执行文件更改我的库的异常策略(考虑到try-catch都在共享库中),或者为什么会发生这种情况?
答案 0 :(得分:1)
两个库必须使用相同的共享 STL进行异常处理才能跨共享库边界工作,并且这两个库必须使用RTTI。如果没有这个,就无法将捕获的异常的typeinfo与抛出的异常匹配。