From b6f5d3e39d1f3073c4e7d75e9d4309112879dc6e Mon Sep 17 00:00:00 2001
From: Jean Chalard <jchalard@google.com>
Date: Tue, 2 Jul 2013 12:51:16 +0900
Subject: [PATCH] Fix offdevice compilation

Change-Id: I8bccccbc51b308fddfbbc990f7bfe1c490259372
---
 native/jni/Android.mk                         |  3 +-
 .../core/dictionary/binary_dictionary_info.h  |  2 +-
 native/jni/src/utils/log_utils.cpp            | 72 +++++++++++++++++++
 native/jni/src/utils/log_utils.h              | 29 +-------
 4 files changed, 77 insertions(+), 29 deletions(-)
 create mode 100644 native/jni/src/utils/log_utils.cpp

diff --git a/native/jni/Android.mk b/native/jni/Android.mk
index f89eea7351..d78da969be 100644
--- a/native/jni/Android.mk
+++ b/native/jni/Android.mk
@@ -79,8 +79,9 @@ LATIN_IME_CORE_SRC_FILES := \
         typing_traversal.cpp \
         typing_weighting.cpp) \
     $(addprefix utils/, \
+        autocorrection_threshold_utils.cpp \
         char_utils.cpp \
-        autocorrection_threshold_utils.cpp)
+        log_utils.cpp)
 
 LOCAL_SRC_FILES := \
     $(LATIN_IME_JNI_SRC_FILES) \
diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h b/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h
index 0fd4f6961b..cbea18f90c 100644
--- a/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h
+++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h
@@ -30,7 +30,7 @@ namespace latinime {
 
 class BinaryDictionaryInfo {
  public:
-    BinaryDictionaryInfo(JNIEnv *env, const uint8_t *const dictBuf,
+     AK_FORCE_INLINE BinaryDictionaryInfo(JNIEnv *env, const uint8_t *const dictBuf,
             const int dictSize, const int mmapFd, const int dictBufOffset, const bool isUpdatable)
             : mDictBuf(dictBuf), mDictSize(dictSize), mMmapFd(mmapFd),
               mDictBufOffset(dictBufOffset), mIsUpdatable(isUpdatable),
diff --git a/native/jni/src/utils/log_utils.cpp b/native/jni/src/utils/log_utils.cpp
new file mode 100644
index 0000000000..5ab2b28622
--- /dev/null
+++ b/native/jni/src/utils/log_utils.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2013, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "log_utils.h"
+
+#include <cstdio>
+#include <stdarg.h>
+
+#include "defines.h"
+
+namespace latinime {
+    /* static */ void LogUtils::logToJava(JNIEnv *const env, const char *const format, ...) {
+        static const char *TAG = "LatinIME:LogUtils";
+        const jclass androidUtilLogClass = env->FindClass("android/util/Log");
+        if (!androidUtilLogClass) {
+            // If we can't find the class, we are probably in off-device testing, and
+            // it's expected. Regardless, logging is not essential to functionality, so
+            // we should just return. However, FindClass has thrown an exception behind
+            // our back and there is no way to prevent it from doing that, so we clear
+            // the exception before we return.
+            env->ExceptionClear();
+            return;
+        }
+        const jmethodID logDotIMethodId = env->GetStaticMethodID(androidUtilLogClass, "i",
+                "(Ljava/lang/String;Ljava/lang/String;)I");
+        if (!logDotIMethodId) {
+            env->ExceptionClear();
+            if (androidUtilLogClass) env->DeleteLocalRef(androidUtilLogClass);
+            return;
+        }
+        const jstring javaTag = env->NewStringUTF(TAG);
+
+        static const int DEFAULT_LINE_SIZE = 128;
+        char fixedSizeCString[DEFAULT_LINE_SIZE];
+        va_list argList;
+        va_start(argList, format);
+        // Get the necessary size. Add 1 for the 0 terminator.
+        const int size = vsnprintf(fixedSizeCString, DEFAULT_LINE_SIZE, format, argList) + 1;
+        va_end(argList);
+
+        jstring javaString;
+        if (size <= DEFAULT_LINE_SIZE) {
+            // The buffer was large enough.
+            javaString = env->NewStringUTF(fixedSizeCString);
+        } else {
+            // The buffer was not large enough.
+            va_start(argList, format);
+            char variableSizeCString[size];
+            vsnprintf(variableSizeCString, size, format, argList);
+            va_end(argList);
+            javaString = env->NewStringUTF(variableSizeCString);
+        }
+
+        env->CallStaticIntMethod(androidUtilLogClass, logDotIMethodId, javaTag, javaString);
+        if (javaString) env->DeleteLocalRef(javaString);
+        if (javaTag) env->DeleteLocalRef(javaTag);
+        if (androidUtilLogClass) env->DeleteLocalRef(androidUtilLogClass);
+    }
+}
diff --git a/native/jni/src/utils/log_utils.h b/native/jni/src/utils/log_utils.h
index ccbecfc1d0..6ac16d91ad 100644
--- a/native/jni/src/utils/log_utils.h
+++ b/native/jni/src/utils/log_utils.h
@@ -17,9 +17,6 @@
 #ifndef LATINIME_LOG_UTILS_H
 #define LATINIME_LOG_UTILS_H
 
-#include <cstdio>
-#include <stdarg.h>
-
 #include "defines.h"
 #include "jni.h"
 
@@ -29,31 +26,9 @@ class LogUtils {
  public:
     static void logToJava(JNIEnv *const env, const char *const format, ...)
 #ifdef __GNUC__
-            __attribute__ ((format (printf, 2, 3)))
+        __attribute__ ((format (printf, 2, 3)))
 #endif // __GNUC__
-            {
-        static const char *TAG = "LatinIME:LogUtils";
-        const jclass androidUtilLogClass = env->FindClass("android/util/Log");
-        const jmethodID logDotIMethodId = env->GetStaticMethodID(androidUtilLogClass, "i",
-                "(Ljava/lang/String;Ljava/lang/String;)I");
-        const jstring javaTag = env->NewStringUTF(TAG);
-
-        va_list argList;
-        va_start(argList, format);
-        // Get the necessary size. Add 1 for the 0 terminator.
-        const int size = vsnprintf(0, 0, format, argList) + 1;
-        va_end(argList);
-        char cString[size];
-        va_start(argList, format);
-        vsnprintf(cString, size, format, argList);
-        va_end(argList);
-
-        jstring javaString = env->NewStringUTF(cString);
-        env->CallStaticIntMethod(androidUtilLogClass, logDotIMethodId, javaTag, javaString);
-        env->DeleteLocalRef(javaString);
-        env->DeleteLocalRef(javaTag);
-        env->DeleteLocalRef(androidUtilLogClass);
-    }
+        ;
 
  private:
     DISALLOW_COPY_AND_ASSIGN(LogUtils);
-- 
GitLab