2017-01-26 5 views
1

Ich habe eine Bibliothek mit NDK-Code-Bibliothek, die ein Sigdev auf ein bestimmtes Gerät, das ich habe, wirft, die meine App tötet. Ist es möglich, diese sigdev zu fangen und eine Java-Ausnahme auslösen? Der Fang muss ohne Änderungen an der Bibliothek durchgeführt werden, die die Ausnahme wirft.Catching NDK SIGABRT von Java-Code ohne Zugriff auf NDK-Code

Die Ausnahme sieht so aus:

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) 

Es gibt ähnliche Fragen an anderer Stelle auf SO gefragt, aber es ist, dass sowohl in den Fällen, scheint sie das NDK steuern und den Java sourc, und verwenden Sie die NDK Code-Trigger eine Java-Ausnahme. In meiner Situation habe ich keine Kontrolle über den NDK-Code, es ist eine Closed-Source-Bibliothek ist, so muß ich es ganz über den Java-Code verarbeiten oder zusätzlichen NDK Code meiner eigenen Schöpfung.

Antwort

1

Sie können nicht fangen nativen Ausnahmen in Java, aber Sie können sie von C++ zu fangen und sie in Java Ausnahmen über eine Wrapper-Bibliothek. Rufen Sie Ihren Wrapper von Java, anstatt der ursprünglichen Bibliothek und lassen Sie Ihre Wrapper-Bibliothek delegieren die Arbeit aber Ausnahmen behandeln.

Dies funktioniert möglicherweise nicht, da das Abfangen von Ausnahmen zwischen den gemeinsamen Bibliotheksgrenzen höchstwahrscheinlich erfordert, dass beide Bibliotheken mit RTTI und Ausnahmen erstellt werden und dieselbe STL verwenden.