diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 9f934c6ef..f7e67673a 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -55,7 +55,7 @@ public class BinaryDictionary extends Dictionary { try { System.loadLibrary("jni_latinime"); } catch (UnsatisfiedLinkError ule) { - Log.e("BinaryDictionary", "Could not load native library jni_latinime"); + Log.e(TAG, "Could not load native library jni_latinime"); } } @@ -71,7 +71,7 @@ public class BinaryDictionary extends Dictionary { mDicTypeId = dicTypeId; } - private native int openNative(String apkFileName, long dictOffset, long dictSize, + private native int openNative(String sourceDir, long dictOffset, long dictSize, int typedLetterMultiplier, int fullWordMultiplier, int maxWordLength, int maxWords, int maxAlternatives); private native void closeNative(int dict); @@ -84,12 +84,21 @@ public class BinaryDictionary extends Dictionary { int maxWordLength, int maxBigrams, int maxAlternatives); private final void loadDictionary(Context context, int resId) { - final AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId); - mNativeDict = openNative(context.getApplicationInfo().sourceDir, - afd.getStartOffset(), afd.getLength(), - TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER, - MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES); - mDictLength = afd.getLength(); + try { + final AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId); + if (afd == null) { + Log.e(TAG, "Found the resource but it is compressed. resId=" + resId); + return; + } + mNativeDict = openNative(context.getApplicationInfo().sourceDir, + afd.getStartOffset(), afd.getLength(), + TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER, + MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES); + mDictLength = afd.getLength(); + } catch (android.content.res.Resources.NotFoundException e) { + Log.e(TAG, "Could not find the resource. resId=" + resId); + return; + } } @Override @@ -165,7 +174,7 @@ public class BinaryDictionary extends Dictionary { } public long getSize() { - return mDictLength; // This value is initialized on the call to openNative() + return mDictLength; // This value is initialized in loadDictionary() } @Override diff --git a/native/Android.mk b/native/Android.mk index 38465acf3..a8fe06d50 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -32,7 +32,7 @@ LOCAL_MODULE := libjni_latinime LOCAL_MODULE_TAGS := user ifeq ($(FLAG_DBG), true) - $(warning "Making debug build.") + $(warning Making debug version of native library) LOCAL_CFLAGS += -DFLAG_DBG LOCAL_SHARED_LIBRARIES := libcutils libutils endif diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index 637429298..6e4e97138 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -50,14 +50,14 @@ static void throwException(JNIEnv *env, const char* ex, const char* fmt, int dat } static jint latinime_BinaryDictionary_open(JNIEnv *env, jobject object, - jstring apkFileName, jlong dictOffset, jlong dictSize, + jstring sourceDir, jlong dictOffset, jlong dictSize, jint typedLetterMultiplier, jint fullWordMultiplier, jint maxWordLength, jint maxWords, jint maxAlternatives) { PROF_OPEN; PROF_START(66); - const char *apkFileNameChars = env->GetStringUTFChars(apkFileName, NULL); - if (apkFileNameChars == NULL) { - LOGE("DICT: Can't get apk file name"); + const char *sourceDirChars = env->GetStringUTFChars(sourceDir, NULL); + if (sourceDirChars == NULL) { + LOGE("DICT: Can't get sourceDir string"); return 0; } int fd = 0; @@ -65,9 +65,9 @@ static jint latinime_BinaryDictionary_open(JNIEnv *env, jobject object, int adjust = 0; #ifdef USE_MMAP_FOR_DICTIONARY /* mmap version */ - fd = open(apkFileNameChars, O_RDONLY); + fd = open(sourceDirChars, O_RDONLY); if (fd < 0) { - LOGE("DICT: Can't open apk file. errno=%d", errno); + LOGE("DICT: Can't open sourceDir. sourceDirChars=%s errno=%d", sourceDirChars, errno); return 0; } int pagesize = getpagesize(); @@ -76,16 +76,16 @@ static jint latinime_BinaryDictionary_open(JNIEnv *env, jobject object, int adjDictSize = dictSize + adjust; dictBuf = mmap(NULL, sizeof(char) * adjDictSize, PROT_READ, MAP_PRIVATE, fd, adjDictOffset); if (dictBuf == MAP_FAILED) { - LOGE("DICT: Can't mmap dictionary file. errno=%d", errno); + LOGE("DICT: Can't mmap dictionary. errno=%d", errno); return 0; } dictBuf = (void *)((char *)dictBuf + adjust); #else // USE_MMAP_FOR_DICTIONARY /* malloc version */ FILE *file = NULL; - file = fopen(apkFileNameChars, "rb"); + file = fopen(sourceDirChars, "rb"); if (file == NULL) { - LOGE("DICT: Can't fopen apk file. errno=%d", errno); + LOGE("DICT: Can't fopen sourceDir. sourceDirChars=%s errno=%d", sourceDirChars, errno); return 0; } dictBuf = malloc(sizeof(char) * dictSize); @@ -109,7 +109,7 @@ static jint latinime_BinaryDictionary_open(JNIEnv *env, jobject object, return 0; } #endif // USE_MMAP_FOR_DICTIONARY - env->ReleaseStringUTFChars(apkFileName, apkFileNameChars); + env->ReleaseStringUTFChars(sourceDir, sourceDirChars); if (!dictBuf) { LOGE("DICT: dictBuf is null");