aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar A. Unique TensorFlower <gardener@tensorflow.org>2018-08-13 05:02:45 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-08-13 05:07:02 -0700
commit2c623eaa7c0dca79d126247393a68d285baeb7f0 (patch)
tree11865dda3ec80107e784c2237d9e57bc0509a3f6
parent9b44e8bd7b116503f9f1fe605d8ff43ef6ee132e (diff)
Log new ErrorReporter and old nnapi delegate errors to logcat.
On Android stderr is not captured for applications, so developers do not see the errors from tflite. This adds logcat output. Output to stderr is kept, as it is convenient for unit tests run through the shell. PiperOrigin-RevId: 208463170
-rw-r--r--tensorflow/contrib/lite/error_reporter.cc13
-rw-r--r--tensorflow/contrib/lite/nnapi_delegate.cc19
2 files changed, 26 insertions, 6 deletions
diff --git a/tensorflow/contrib/lite/error_reporter.cc b/tensorflow/contrib/lite/error_reporter.cc
index 03fcd5409c..646913c026 100644
--- a/tensorflow/contrib/lite/error_reporter.cc
+++ b/tensorflow/contrib/lite/error_reporter.cc
@@ -16,6 +16,10 @@ limitations under the License.
#include <cstdarg>
#include <cstdio>
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+
namespace tflite {
ErrorReporter::~ErrorReporter() {}
@@ -39,6 +43,15 @@ int ErrorReporter::ReportError(void*, const char* format, ...) {
}
int StderrReporter::Report(const char* format, va_list args) {
+#ifdef __ANDROID__
+ // On Android stderr is not captured for applications, only for code run from
+ // the shell. Rather than assume all users will set up a custom error
+ // reporter, let's output to logcat here
+ va_list args_for_log;
+ va_copy(args_for_log, args);
+ __android_log_vprint(ANDROID_LOG_ERROR, "tflite", format, args_for_log);
+ va_end(args_for_log);
+#endif
const int result = vfprintf(stderr, format, args);
fputc('\n', stderr);
return result;
diff --git a/tensorflow/contrib/lite/nnapi_delegate.cc b/tensorflow/contrib/lite/nnapi_delegate.cc
index 13325a8c7c..3f3d3ef5d1 100644
--- a/tensorflow/contrib/lite/nnapi_delegate.cc
+++ b/tensorflow/contrib/lite/nnapi_delegate.cc
@@ -24,20 +24,27 @@ limitations under the License.
#include "tensorflow/contrib/lite/nnapi/NeuralNetworksShim.h"
#ifdef __ANDROID__
+#include <android/log.h>
#include <sys/system_properties.h>
#endif
namespace tflite {
void logError(const char* format, ...) {
- // TODO(mikie): use android logging, stderr is not captured for Java
- // applications
- va_list args;
- va_start(args, format);
- vfprintf(stderr, format, args);
- va_end(args);
+ // stderr is convenient for native tests, but is not captured for apps
+ va_list args_for_stderr;
+ va_start(args_for_stderr, format);
+ vfprintf(stderr, format, args_for_stderr);
+ va_end(args_for_stderr);
fprintf(stderr, "\n");
fflush(stderr);
+#ifdef __ANDROID__
+ // produce logcat output for general consumption
+ va_list args_for_log;
+ va_start(args_for_log, format);
+ __android_log_vprint(ANDROID_LOG_ERROR, "tflite", format, args_for_log);
+ va_end(args_for_log);
+#endif
}
#define FATAL(...) \