aboutsummaryrefslogtreecommitdiffstats
path: root/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp')
-rw-r--r--native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp148
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) {