2017-01-26 27 views
1

我有一个库ndk代码库,它正在我的特定设备上抛出sigdev,这会杀死我的应用程序。是否有可能赶上这个sigdev并抛出一个Java异常?捕捉必须在不修改抛出异常的库的情况下完成。从Java代码中捕获NDK SIGABRT而无法访问ndk代码

例外看起来像这样:

01-26 09:09:38.610 19393-19869/com.foo.bar A/libc: /Volumes/Android/buildbot/src/android/ndk-r12-release/ndk/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/abort_message.cpp:74: void abort_message(const char *, ...): assertion "terminating with uncaught exception of type char const*" failed 
01-26 09:09:38.610 19393-19869/com.foo.bar A/libc: Fatal signal 6 (SIGABRT) at 0x00004bc1 (code=-6), thread 19869 (Thread-9201) 

上有SO别处问类似的问题,但它似乎在这些情况下,他们同时控制NDK和Java源程序,并使用NDK代码触发一个java异常。在我的情况下,我无法控制ndk代码,它是一个封闭的源代码库,所以我必须完全通过Java代码或我自己创建的其他ndk代码来处理它。

回答

1

你不能在Java中捕捉本地异常,但你可以从C++中捕获它们,并通过一个包装库将它们变成Java异常。从Java而不是原始库调用你的包装器,并让你的包装器库委托工作,但处理异常。

这可能无法正常工作,因为跨共享库边界捕获异常很可能需要使用RTTI构建两个库,异常并使用相同的STL。