2017-01-26 25 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。