diff options
Diffstat (limited to 'native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp')
-rw-r--r-- | native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp | 148 |
1 files changed, 60 insertions, 88 deletions
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index 1dd68ea8b..f60793733 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -14,27 +14,23 @@ * limitations under the License. */ -#include <cstring> // for memset() - #define LOG_TAG "LatinIME: jni: BinaryDictionary" -#include "defines.h" // for macros below +#include "com_android_inputmethod_latin_BinaryDictionary.h" -#ifdef USE_MMAP_FOR_DICTIONARY #include <cerrno> +#include <cstring> // for memset() #include <fcntl.h> #include <sys/mman.h> -#else // USE_MMAP_FOR_DICTIONARY -#include <cstdlib> -#include <cstdio> // for fopen() etc. -#endif // USE_MMAP_FOR_DICTIONARY -#include "binary_format.h" -#include "com_android_inputmethod_latin_BinaryDictionary.h" -#include "correction.h" -#include "dictionary.h" +#include "defines.h" #include "jni.h" #include "jni_common.h" +#include "obsolete/correction.h" +#include "suggest/core/dictionary/binary_dictionary_format.h" +#include "suggest/core/dictionary/binary_dictionary_info.h" +#include "suggest/core/dictionary/dictionary.h" +#include "suggest/core/suggest_options.h" namespace latinime { @@ -57,8 +53,6 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s int fd = 0; void *dictBuf = 0; int adjust = 0; -#ifdef USE_MMAP_FOR_DICTIONARY - /* mmap version */ fd = open(sourceDirChars, O_RDONLY); if (fd < 0) { AKLOGE("DICT: Can't open sourceDir. sourceDirChars=%s errno=%d", sourceDirChars, errno); @@ -74,49 +68,16 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s return 0; } dictBuf = static_cast<char *>(dictBuf) + adjust; -#else // USE_MMAP_FOR_DICTIONARY - /* malloc version */ - FILE *file = 0; - file = fopen(sourceDirChars, "rb"); - if (file == 0) { - AKLOGE("DICT: Can't fopen sourceDir. sourceDirChars=%s errno=%d", sourceDirChars, errno); - return 0; - } - dictBuf = malloc(dictSize); - if (!dictBuf) { - AKLOGE("DICT: Can't allocate memory region for dictionary. errno=%d", errno); - return 0; - } - int ret = fseek(file, static_cast<long>(dictOffset), SEEK_SET); - if (ret != 0) { - AKLOGE("DICT: Failure in fseek. ret=%d errno=%d", ret, errno); - return 0; - } - ret = fread(dictBuf, dictSize, 1, file); - if (ret != 1) { - AKLOGE("DICT: Failure in fread. ret=%d errno=%d", ret, errno); - return 0; - } - ret = fclose(file); - if (ret != 0) { - AKLOGE("DICT: Failure in fclose. ret=%d errno=%d", ret, errno); - return 0; - } -#endif // USE_MMAP_FOR_DICTIONARY if (!dictBuf) { AKLOGE("DICT: dictBuf is null"); return 0; } Dictionary *dictionary = 0; - if (BinaryFormat::UNKNOWN_FORMAT - == BinaryFormat::detectFormat(static_cast<uint8_t *>(dictBuf), + if (BinaryDictionaryFormat::UNKNOWN_VERSION + == BinaryDictionaryFormat::detectFormatVersion(static_cast<uint8_t *>(dictBuf), static_cast<int>(dictSize))) { AKLOGE("DICT: dictionary format is unknown, bad magic number"); -#ifdef USE_MMAP_FOR_DICTIONARY releaseDictBuf(static_cast<const char *>(dictBuf) - adjust, adjDictSize, fd); -#else // USE_MMAP_FOR_DICTIONARY - releaseDictBuf(dictBuf, 0, 0); -#endif // USE_MMAP_FOR_DICTIONARY } else { dictionary = new Dictionary(dictBuf, static_cast<int>(dictSize), fd, adjust); } @@ -128,14 +89,14 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s static int latinime_BinaryDictionary_getSuggestions(JNIEnv *env, jclass clazz, jlong dict, jlong proximityInfo, jlong dicTraverseSession, jintArray xCoordinatesArray, jintArray yCoordinatesArray, jintArray timesArray, jintArray pointerIdsArray, - jintArray inputCodePointsArray, jint inputSize, jint commitPoint, jboolean isGesture, - jintArray prevWordCodePointsForBigrams, jboolean useFullEditDistance, - jintArray outputCodePointsArray, jintArray scoresArray, jintArray spaceIndicesArray, - jintArray outputTypesArray) { + jintArray inputCodePointsArray, jint inputSize, jint commitPoint, jintArray suggestOptions, + jintArray prevWordCodePointsForBigrams, jintArray outputCodePointsArray, + jintArray scoresArray, jintArray spaceIndicesArray, jintArray outputTypesArray) { Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict); if (!dictionary) return 0; ProximityInfo *pInfo = reinterpret_cast<ProximityInfo *>(proximityInfo); - void *traverseSession = reinterpret_cast<void *>(dicTraverseSession); + DicTraverseSession *traverseSession = + reinterpret_cast<DicTraverseSession *>(dicTraverseSession); // Input values int xCoordinates[inputSize]; @@ -159,6 +120,11 @@ static int latinime_BinaryDictionary_getSuggestions(JNIEnv *env, jclass clazz, j prevWordCodePoints = prevWordCodePointsInternal; } + const jsize numberOfOptions = env->GetArrayLength(suggestOptions); + int options[numberOfOptions]; + env->GetIntArrayRegion(suggestOptions, 0, numberOfOptions, options); + SuggestOptions givenSuggestOptions(options, numberOfOptions); + // Output values /* By the way, let's check the output array length here to make sure */ const jsize outputCodePointsLength = env->GetArrayLength(outputCodePointsArray); @@ -185,11 +151,11 @@ static int latinime_BinaryDictionary_getSuggestions(JNIEnv *env, jclass clazz, j memset(outputTypes, 0, sizeof(outputTypes)); int count; - if (isGesture || inputSize > 0) { + if (givenSuggestOptions.isGesture() || inputSize > 0) { count = dictionary->getSuggestions(pInfo, traverseSession, xCoordinates, yCoordinates, times, pointerIds, inputCodePoints, inputSize, prevWordCodePoints, - prevWordCodePointsLength, commitPoint, isGesture, useFullEditDistance, - outputCodePoints, scores, spaceIndices, outputTypes); + prevWordCodePointsLength, commitPoint, &givenSuggestOptions, outputCodePoints, + scores, spaceIndices, outputTypes); } else { count = dictionary->getBigrams(prevWordCodePoints, prevWordCodePointsLength, inputCodePoints, inputSize, outputCodePoints, scores, outputTypes); @@ -254,19 +220,14 @@ static jint latinime_BinaryDictionary_editDistance(JNIEnv *env, jclass clazz, ji static void latinime_BinaryDictionary_close(JNIEnv *env, jclass clazz, jlong dict) { Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict); if (!dictionary) return; - const void *dictBuf = dictionary->getDict(); + const void *dictBuf = dictionary->getBinaryDictionaryInfo()->getDictBuf(); if (!dictBuf) return; -#ifdef USE_MMAP_FOR_DICTIONARY releaseDictBuf(static_cast<const char *>(dictBuf) - dictionary->getDictBufAdjust(), dictionary->getDictSize() + dictionary->getDictBufAdjust(), dictionary->getMmapFd()); -#else // USE_MMAP_FOR_DICTIONARY - releaseDictBuf(dictBuf, 0, 0); -#endif // USE_MMAP_FOR_DICTIONARY delete dictionary; } static void releaseDictBuf(const void *dictBuf, const size_t length, const int fd) { -#ifdef USE_MMAP_FOR_DICTIONARY int ret = munmap(const_cast<void *>(dictBuf), length); if (ret != 0) { AKLOGE("DICT: Failure in munmap. ret=%d errno=%d", ret, errno); @@ -275,33 +236,44 @@ static void releaseDictBuf(const void *dictBuf, const size_t length, const int f if (ret != 0) { AKLOGE("DICT: Failure in close. ret=%d errno=%d", ret, errno); } -#else // USE_MMAP_FOR_DICTIONARY - free(const_cast<void *>(dictBuf)); -#endif // USE_MMAP_FOR_DICTIONARY } -static JNINativeMethod sMethods[] = { - {const_cast<char *>("openNative"), - const_cast<char *>("(Ljava/lang/String;JJ)J"), - reinterpret_cast<void *>(latinime_BinaryDictionary_open)}, - {const_cast<char *>("closeNative"), - const_cast<char *>("(J)V"), - reinterpret_cast<void *>(latinime_BinaryDictionary_close)}, - {const_cast<char *>("getSuggestionsNative"), - const_cast<char *>("(JJJ[I[I[I[I[IIIZ[IZ[I[I[I[I)I"), - reinterpret_cast<void *>(latinime_BinaryDictionary_getSuggestions)}, - {const_cast<char *>("getProbabilityNative"), - const_cast<char *>("(J[I)I"), - reinterpret_cast<void *>(latinime_BinaryDictionary_getProbability)}, - {const_cast<char *>("isValidBigramNative"), - const_cast<char *>("(J[I[I)Z"), - reinterpret_cast<void *>(latinime_BinaryDictionary_isValidBigram)}, - {const_cast<char *>("calcNormalizedScoreNative"), - const_cast<char *>("([I[II)F"), - reinterpret_cast<void *>(latinime_BinaryDictionary_calcNormalizedScore)}, - {const_cast<char *>("editDistanceNative"), - const_cast<char *>("([I[I)I"), - reinterpret_cast<void *>(latinime_BinaryDictionary_editDistance)} +static const JNINativeMethod sMethods[] = { + { + const_cast<char *>("openNative"), + const_cast<char *>("(Ljava/lang/String;JJ)J"), + reinterpret_cast<void *>(latinime_BinaryDictionary_open) + }, + { + const_cast<char *>("closeNative"), + const_cast<char *>("(J)V"), + reinterpret_cast<void *>(latinime_BinaryDictionary_close) + }, + { + const_cast<char *>("getSuggestionsNative"), + const_cast<char *>("(JJJ[I[I[I[I[III[I[I[I[I[I[I)I"), + reinterpret_cast<void *>(latinime_BinaryDictionary_getSuggestions) + }, + { + const_cast<char *>("getProbabilityNative"), + const_cast<char *>("(J[I)I"), + reinterpret_cast<void *>(latinime_BinaryDictionary_getProbability) + }, + { + const_cast<char *>("isValidBigramNative"), + const_cast<char *>("(J[I[I)Z"), + reinterpret_cast<void *>(latinime_BinaryDictionary_isValidBigram) + }, + { + const_cast<char *>("calcNormalizedScoreNative"), + const_cast<char *>("([I[II)F"), + reinterpret_cast<void *>(latinime_BinaryDictionary_calcNormalizedScore) + }, + { + const_cast<char *>("editDistanceNative"), + const_cast<char *>("([I[I)I"), + reinterpret_cast<void *>(latinime_BinaryDictionary_editDistance) + } }; int register_BinaryDictionary(JNIEnv *env) { |