diff --git a/native/jni/NativeFileList.mk b/native/jni/NativeFileList.mk index 55bb68344..0be7153d6 100644 --- a/native/jni/NativeFileList.mk +++ b/native/jni/NativeFileList.mk @@ -30,8 +30,7 @@ LATIN_IME_CORE_SRC_FILES := \ 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 9c065e0d1..8f1e35e0f 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -351,10 +351,9 @@ static void latinime_BinaryDictionary_getWordProperty(JNIEnv *env, jclass clazz, } 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 019f0880f..000000000 --- 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, "", "(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 *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 *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 d4db3f09f..9efc7f304 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 #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 @@ class WordProperty { : 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 5555293d5..41f0623d8 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 &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, "", "(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 *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 *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 a259e1cd0..01295859c 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 @@ class JniDataUtils { 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);