Remove dependency on jni.h from WordProperty.

Bug: 18725954
Change-Id: Ic97d3a56b036ff042322c9f794504064046fd7d7
diff --git a/native/jni/NativeFileList.mk b/native/jni/NativeFileList.mk
index 55bb683..0be7153 100644
--- a/native/jni/NativeFileList.mk
+++ b/native/jni/NativeFileList.mk
@@ -30,8 +30,7 @@
         dictionary_utils.cpp \
         digraph_utils.cpp \
         error_type_utils.cpp \
-        multi_bigram_map.cpp \
-        property/word_property.cpp) \
+        multi_bigram_map.cpp) \
     $(addprefix suggest/core/layout/, \
         additional_proximity_chars.cpp \
         proximity_info.cpp \
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 9c065e0..8f1e35e 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -351,10 +351,9 @@
     }
     const WordProperty wordProperty = dictionary->getWordProperty(
             CodePointArrayView(wordCodePoints, codePointCount));
-    wordProperty.outputProperties(env, outCodePoints, outFlags, outProbabilityInfo,
+    JniDataUtils::outputWordProperty(env, wordProperty, outCodePoints, outFlags, outProbabilityInfo,
             outNgramPrevWordsArray, outNgramPrevWordIsBeginningOfSentenceArray,
-            outNgramTargets, outNgramProbabilityInfo, outShortcutTargets,
-            outShortcutProbabilities);
+            outNgramTargets, outNgramProbabilityInfo, outShortcutTargets, outShortcutProbabilities);
 }
 
 static bool latinime_BinaryDictionary_addUnigramEntry(JNIEnv *env, jclass clazz, jlong dict,
diff --git a/native/jni/src/suggest/core/dictionary/property/word_property.cpp b/native/jni/src/suggest/core/dictionary/property/word_property.cpp
deleted file mode 100644
index 019f088..0000000
--- a/native/jni/src/suggest/core/dictionary/property/word_property.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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 "suggest/core/dictionary/property/word_property.h"
-
-#include "utils/jni_data_utils.h"
-#include "suggest/core/dictionary/property/historical_info.h"
-
-namespace latinime {
-
-void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
-        jbooleanArray outFlags, jintArray outProbabilityInfo,
-        jobject outNgramPrevWordsArray, jobject outNgramPrevWordIsBeginningOfSentenceArray,
-        jobject outNgramTargets, jobject outNgramProbabilities, jobject outShortcutTargets,
-        jobject outShortcutProbabilities) const {
-    JniDataUtils::outputCodePoints(env, outCodePoints, 0 /* start */,
-            MAX_WORD_LENGTH /* maxLength */, mCodePoints.data(), mCodePoints.size(),
-            false /* needsNullTermination */);
-    jboolean flags[] = {mUnigramProperty.isNotAWord(), mUnigramProperty.isPossiblyOffensive(),
-            !mNgrams.empty(), mUnigramProperty.hasShortcuts(),
-            mUnigramProperty.representsBeginningOfSentence()};
-    env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
-    const HistoricalInfo &historicalInfo = mUnigramProperty.getHistoricalInfo();
-    int probabilityInfo[] = {mUnigramProperty.getProbability(), historicalInfo.getTimestamp(),
-            historicalInfo.getLevel(), historicalInfo.getCount()};
-    env->SetIntArrayRegion(outProbabilityInfo, 0 /* start */, NELEMS(probabilityInfo),
-            probabilityInfo);
-
-    jclass integerClass = env->FindClass("java/lang/Integer");
-    jmethodID intToIntegerConstructorId = env->GetMethodID(integerClass, "<init>", "(I)V");
-    jclass arrayListClass = env->FindClass("java/util/ArrayList");
-    jmethodID addMethodId = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
-
-    // Output ngrams.
-    jclass intArrayClass = env->FindClass("[I");
-    for (const auto &ngramProperty : mNgrams) {
-        const NgramContext *const ngramContext = ngramProperty.getNgramContext();
-        jobjectArray prevWordWordCodePointsArray = env->NewObjectArray(
-                ngramContext->getPrevWordCount(), intArrayClass, nullptr);
-        jbooleanArray prevWordIsBeginningOfSentenceArray =
-                env->NewBooleanArray(ngramContext->getPrevWordCount());
-        for (size_t i = 0; i < ngramContext->getPrevWordCount(); ++i) {
-            const CodePointArrayView codePoints = ngramContext->getNthPrevWordCodePoints(i + 1);
-            jintArray prevWordCodePoints = env->NewIntArray(codePoints.size());
-            JniDataUtils::outputCodePoints(env, prevWordCodePoints, 0 /* start */,
-                    codePoints.size(), codePoints.data(), codePoints.size(),
-                    false /* needsNullTermination */);
-            env->SetObjectArrayElement(prevWordWordCodePointsArray, i, prevWordCodePoints);
-            env->DeleteLocalRef(prevWordCodePoints);
-            JniDataUtils::putBooleanToArray(env, prevWordIsBeginningOfSentenceArray, i,
-                    ngramContext->isNthPrevWordBeginningOfSentence(i + 1));
-        }
-        env->CallBooleanMethod(outNgramPrevWordsArray, addMethodId, prevWordWordCodePointsArray);
-        env->CallBooleanMethod(outNgramPrevWordIsBeginningOfSentenceArray, addMethodId,
-                prevWordIsBeginningOfSentenceArray);
-        env->DeleteLocalRef(prevWordWordCodePointsArray);
-        env->DeleteLocalRef(prevWordIsBeginningOfSentenceArray);
-
-        const std::vector<int> *const targetWordCodePoints = ngramProperty.getTargetCodePoints();
-        jintArray targetWordCodePointArray = env->NewIntArray(targetWordCodePoints->size());
-        JniDataUtils::outputCodePoints(env, targetWordCodePointArray, 0 /* start */,
-                targetWordCodePoints->size(), targetWordCodePoints->data(),
-                targetWordCodePoints->size(), false /* needsNullTermination */);
-        env->CallBooleanMethod(outNgramTargets, addMethodId, targetWordCodePointArray);
-        env->DeleteLocalRef(targetWordCodePointArray);
-
-        const HistoricalInfo &ngramHistoricalInfo = ngramProperty.getHistoricalInfo();
-        int bigramProbabilityInfo[] = {ngramProperty.getProbability(),
-                ngramHistoricalInfo.getTimestamp(), ngramHistoricalInfo.getLevel(),
-                ngramHistoricalInfo.getCount()};
-        jintArray bigramProbabilityInfoArray = env->NewIntArray(NELEMS(bigramProbabilityInfo));
-        env->SetIntArrayRegion(bigramProbabilityInfoArray, 0 /* start */,
-                NELEMS(bigramProbabilityInfo), bigramProbabilityInfo);
-        env->CallBooleanMethod(outNgramProbabilities, addMethodId, bigramProbabilityInfoArray);
-        env->DeleteLocalRef(bigramProbabilityInfoArray);
-    }
-
-    // Output shortcuts.
-    for (const auto &shortcut : mUnigramProperty.getShortcuts()) {
-        const std::vector<int> *const targetCodePoints = shortcut.getTargetCodePoints();
-        jintArray shortcutTargetCodePointArray = env->NewIntArray(targetCodePoints->size());
-        JniDataUtils::outputCodePoints(env, shortcutTargetCodePointArray, 0 /* start */,
-                targetCodePoints->size(), targetCodePoints->data(), targetCodePoints->size(),
-                false /* needsNullTermination */);
-        env->CallBooleanMethod(outShortcutTargets, addMethodId, shortcutTargetCodePointArray);
-        env->DeleteLocalRef(shortcutTargetCodePointArray);
-        jobject integerProbability = env->NewObject(integerClass, intToIntegerConstructorId,
-                shortcut.getProbability());
-        env->CallBooleanMethod(outShortcutProbabilities, addMethodId, integerProbability);
-        env->DeleteLocalRef(integerProbability);
-    }
-    env->DeleteLocalRef(integerClass);
-    env->DeleteLocalRef(arrayListClass);
-}
-
-} // namespace latinime
diff --git a/native/jni/src/suggest/core/dictionary/property/word_property.h b/native/jni/src/suggest/core/dictionary/property/word_property.h
index d4db3f0..9efc7f3 100644
--- a/native/jni/src/suggest/core/dictionary/property/word_property.h
+++ b/native/jni/src/suggest/core/dictionary/property/word_property.h
@@ -20,7 +20,6 @@
 #include <vector>
 
 #include "defines.h"
-#include "jni.h"
 #include "suggest/core/dictionary/property/ngram_property.h"
 #include "suggest/core/dictionary/property/unigram_property.h"
 #include "utils/int_array_view.h"
@@ -39,12 +38,6 @@
             : mCodePoints(std::move(codePoints)), mUnigramProperty(unigramProperty),
               mNgrams(ngrams) {}
 
-    void outputProperties(JNIEnv *const env, jintArray outCodePoints, jbooleanArray outFlags,
-            jintArray outProbabilityInfo, jobject outNgramPrevWordsArray,
-            jobject outNgramPrevWordIsBeginningOfSentenceArray, jobject outNgramTargets,
-            jobject outNgramProbabilities, jobject outShortcutTargets,
-            jobject outShortcutProbabilities) const;
-
     const CodePointArrayView getCodePoints() const {
         return CodePointArrayView(mCodePoints);
     }
diff --git a/native/jni/src/utils/jni_data_utils.cpp b/native/jni/src/utils/jni_data_utils.cpp
index 5555293..41f0623 100644
--- a/native/jni/src/utils/jni_data_utils.cpp
+++ b/native/jni/src/utils/jni_data_utils.cpp
@@ -16,9 +16,100 @@
 
 #include "utils/jni_data_utils.h"
 
+#include "utils/int_array_view.h"
+
 namespace latinime {
 
 const int JniDataUtils::CODE_POINT_REPLACEMENT_CHARACTER = 0xFFFD;
 const int JniDataUtils::CODE_POINT_NULL = 0;
 
+/* static */ void JniDataUtils::outputWordProperty(JNIEnv *const env,
+        const WordProperty &wordProperty, jintArray outCodePoints, jbooleanArray outFlags,
+        jintArray outProbabilityInfo, jobject outNgramPrevWordsArray,
+        jobject outNgramPrevWordIsBeginningOfSentenceArray, jobject outNgramTargets,
+        jobject outNgramProbabilities, jobject outShortcutTargets,
+        jobject outShortcutProbabilities) {
+    const CodePointArrayView codePoints = wordProperty.getCodePoints();
+    JniDataUtils::outputCodePoints(env, outCodePoints, 0 /* start */,
+            MAX_WORD_LENGTH /* maxLength */, codePoints.data(), codePoints.size(),
+            false /* needsNullTermination */);
+    const UnigramProperty &unigramProperty = wordProperty.getUnigramProperty();
+    const std::vector<NgramProperty> &ngrams = wordProperty.getNgramProperties();
+    jboolean flags[] = {unigramProperty.isNotAWord(), unigramProperty.isPossiblyOffensive(),
+            !ngrams.empty(), unigramProperty.hasShortcuts(),
+            unigramProperty.representsBeginningOfSentence()};
+    env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
+    const HistoricalInfo &historicalInfo = unigramProperty.getHistoricalInfo();
+    int probabilityInfo[] = {unigramProperty.getProbability(), historicalInfo.getTimestamp(),
+            historicalInfo.getLevel(), historicalInfo.getCount()};
+    env->SetIntArrayRegion(outProbabilityInfo, 0 /* start */, NELEMS(probabilityInfo),
+            probabilityInfo);
+
+    jclass integerClass = env->FindClass("java/lang/Integer");
+    jmethodID intToIntegerConstructorId = env->GetMethodID(integerClass, "<init>", "(I)V");
+    jclass arrayListClass = env->FindClass("java/util/ArrayList");
+    jmethodID addMethodId = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
+
+    // Output ngrams.
+    jclass intArrayClass = env->FindClass("[I");
+    for (const auto &ngramProperty : ngrams) {
+        const NgramContext *const ngramContext = ngramProperty.getNgramContext();
+        jobjectArray prevWordWordCodePointsArray = env->NewObjectArray(
+                ngramContext->getPrevWordCount(), intArrayClass, nullptr);
+        jbooleanArray prevWordIsBeginningOfSentenceArray =
+                env->NewBooleanArray(ngramContext->getPrevWordCount());
+        for (size_t i = 0; i < ngramContext->getPrevWordCount(); ++i) {
+            const CodePointArrayView codePoints = ngramContext->getNthPrevWordCodePoints(i + 1);
+            jintArray prevWordCodePoints = env->NewIntArray(codePoints.size());
+            JniDataUtils::outputCodePoints(env, prevWordCodePoints, 0 /* start */,
+                    codePoints.size(), codePoints.data(), codePoints.size(),
+                    false /* needsNullTermination */);
+            env->SetObjectArrayElement(prevWordWordCodePointsArray, i, prevWordCodePoints);
+            env->DeleteLocalRef(prevWordCodePoints);
+            JniDataUtils::putBooleanToArray(env, prevWordIsBeginningOfSentenceArray, i,
+                    ngramContext->isNthPrevWordBeginningOfSentence(i + 1));
+        }
+        env->CallBooleanMethod(outNgramPrevWordsArray, addMethodId, prevWordWordCodePointsArray);
+        env->CallBooleanMethod(outNgramPrevWordIsBeginningOfSentenceArray, addMethodId,
+                prevWordIsBeginningOfSentenceArray);
+        env->DeleteLocalRef(prevWordWordCodePointsArray);
+        env->DeleteLocalRef(prevWordIsBeginningOfSentenceArray);
+
+        const std::vector<int> *const targetWordCodePoints = ngramProperty.getTargetCodePoints();
+        jintArray targetWordCodePointArray = env->NewIntArray(targetWordCodePoints->size());
+        JniDataUtils::outputCodePoints(env, targetWordCodePointArray, 0 /* start */,
+                targetWordCodePoints->size(), targetWordCodePoints->data(),
+                targetWordCodePoints->size(), false /* needsNullTermination */);
+        env->CallBooleanMethod(outNgramTargets, addMethodId, targetWordCodePointArray);
+        env->DeleteLocalRef(targetWordCodePointArray);
+
+        const HistoricalInfo &ngramHistoricalInfo = ngramProperty.getHistoricalInfo();
+        int bigramProbabilityInfo[] = {ngramProperty.getProbability(),
+                ngramHistoricalInfo.getTimestamp(), ngramHistoricalInfo.getLevel(),
+                ngramHistoricalInfo.getCount()};
+        jintArray bigramProbabilityInfoArray = env->NewIntArray(NELEMS(bigramProbabilityInfo));
+        env->SetIntArrayRegion(bigramProbabilityInfoArray, 0 /* start */,
+                NELEMS(bigramProbabilityInfo), bigramProbabilityInfo);
+        env->CallBooleanMethod(outNgramProbabilities, addMethodId, bigramProbabilityInfoArray);
+        env->DeleteLocalRef(bigramProbabilityInfoArray);
+    }
+
+    // Output shortcuts.
+    for (const auto &shortcut : unigramProperty.getShortcuts()) {
+        const std::vector<int> *const targetCodePoints = shortcut.getTargetCodePoints();
+        jintArray shortcutTargetCodePointArray = env->NewIntArray(targetCodePoints->size());
+        JniDataUtils::outputCodePoints(env, shortcutTargetCodePointArray, 0 /* start */,
+                targetCodePoints->size(), targetCodePoints->data(), targetCodePoints->size(),
+                false /* needsNullTermination */);
+        env->CallBooleanMethod(outShortcutTargets, addMethodId, shortcutTargetCodePointArray);
+        env->DeleteLocalRef(shortcutTargetCodePointArray);
+        jobject integerProbability = env->NewObject(integerClass, intToIntegerConstructorId,
+                shortcut.getProbability());
+        env->CallBooleanMethod(outShortcutProbabilities, addMethodId, integerProbability);
+        env->DeleteLocalRef(integerProbability);
+    }
+    env->DeleteLocalRef(integerClass);
+    env->DeleteLocalRef(arrayListClass);
+}
+
 } // namespace latinime
diff --git a/native/jni/src/utils/jni_data_utils.h b/native/jni/src/utils/jni_data_utils.h
index a259e1c..0129585 100644
--- a/native/jni/src/utils/jni_data_utils.h
+++ b/native/jni/src/utils/jni_data_utils.h
@@ -21,6 +21,7 @@
 
 #include "defines.h"
 #include "jni.h"
+#include "suggest/core/dictionary/property/word_property.h"
 #include "suggest/core/session/ngram_context.h"
 #include "suggest/core/policy/dictionary_header_structure_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_read_write_utils.h"
@@ -140,6 +141,12 @@
         env->SetFloatArrayRegion(array, index, 1 /* len */, &value);
     }
 
+    static void outputWordProperty(JNIEnv *const env, const WordProperty &wordProperty,
+            jintArray outCodePoints, jbooleanArray outFlags, jintArray outProbabilityInfo,
+            jobject outNgramPrevWordsArray, jobject outNgramPrevWordIsBeginningOfSentenceArray,
+            jobject outNgramTargets, jobject outNgramProbabilities, jobject outShortcutTargets,
+            jobject outShortcutProbabilities);
+
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(JniDataUtils);