1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "suggest/core/dictionary/property/word_property.h" 18 19#include "utils/jni_data_utils.h" 20 21namespace latinime { 22 23void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints, 24 jbooleanArray outFlags, jintArray outProbabilityInfo, jobject outBigramTargets, 25 jobject outBigramProbabilities, jobject outShortcutTargets, 26 jobject outShortcutProbabilities) const { 27 JniDataUtils::outputCodePoints(env, outCodePoints, 0 /* start */, 28 MAX_WORD_LENGTH /* maxLength */, mCodePoints.data(), mCodePoints.size(), 29 false /* needsNullTermination */); 30 jboolean flags[] = {mUnigramProperty.isNotAWord(), mUnigramProperty.isBlacklisted(), 31 !mBigrams.empty(), mUnigramProperty.hasShortcuts(), 32 mUnigramProperty.representsBeginningOfSentence()}; 33 env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags); 34 int probabilityInfo[] = {mUnigramProperty.getProbability(), mUnigramProperty.getTimestamp(), 35 mUnigramProperty.getLevel(), mUnigramProperty.getCount()}; 36 env->SetIntArrayRegion(outProbabilityInfo, 0 /* start */, NELEMS(probabilityInfo), 37 probabilityInfo); 38 39 jclass integerClass = env->FindClass("java/lang/Integer"); 40 jmethodID intToIntegerConstructorId = env->GetMethodID(integerClass, "<init>", "(I)V"); 41 jclass arrayListClass = env->FindClass("java/util/ArrayList"); 42 jmethodID addMethodId = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z"); 43 44 // Output bigrams. 45 for (const auto &bigramProperty : mBigrams) { 46 const std::vector<int> *const word1CodePoints = bigramProperty.getTargetCodePoints(); 47 jintArray bigramWord1CodePointArray = env->NewIntArray(word1CodePoints->size()); 48 JniDataUtils::outputCodePoints(env, bigramWord1CodePointArray, 0 /* start */, 49 word1CodePoints->size(), word1CodePoints->data(), word1CodePoints->size(), 50 false /* needsNullTermination */); 51 env->CallBooleanMethod(outBigramTargets, addMethodId, bigramWord1CodePointArray); 52 env->DeleteLocalRef(bigramWord1CodePointArray); 53 54 int bigramProbabilityInfo[] = {bigramProperty.getProbability(), 55 bigramProperty.getTimestamp(), bigramProperty.getLevel(), 56 bigramProperty.getCount()}; 57 jintArray bigramProbabilityInfoArray = env->NewIntArray(NELEMS(bigramProbabilityInfo)); 58 env->SetIntArrayRegion(bigramProbabilityInfoArray, 0 /* start */, 59 NELEMS(bigramProbabilityInfo), bigramProbabilityInfo); 60 env->CallBooleanMethod(outBigramProbabilities, addMethodId, bigramProbabilityInfoArray); 61 env->DeleteLocalRef(bigramProbabilityInfoArray); 62 } 63 64 // Output shortcuts. 65 for (const auto &shortcut : mUnigramProperty.getShortcuts()) { 66 const std::vector<int> *const targetCodePoints = shortcut.getTargetCodePoints(); 67 jintArray shortcutTargetCodePointArray = env->NewIntArray(targetCodePoints->size()); 68 env->SetIntArrayRegion(shortcutTargetCodePointArray, 0 /* start */, 69 targetCodePoints->size(), targetCodePoints->data()); 70 JniDataUtils::outputCodePoints(env, shortcutTargetCodePointArray, 0 /* start */, 71 targetCodePoints->size(), targetCodePoints->data(), targetCodePoints->size(), 72 false /* needsNullTermination */); 73 env->CallBooleanMethod(outShortcutTargets, addMethodId, shortcutTargetCodePointArray); 74 env->DeleteLocalRef(shortcutTargetCodePointArray); 75 jobject integerProbability = env->NewObject(integerClass, intToIntegerConstructorId, 76 shortcut.getProbability()); 77 env->CallBooleanMethod(outShortcutProbabilities, addMethodId, integerProbability); 78 env->DeleteLocalRef(integerProbability); 79 } 80 env->DeleteLocalRef(integerClass); 81 env->DeleteLocalRef(arrayListClass); 82} 83 84} // namespace latinime 85