Clean up: Update variable names to comply with spec of ApplicationInfo.

ApplicationInfo.sourceDir may or may not be apk file name.  It can be a directory as well.
The spec just says it's "Full path to the location of this package".

Also, added error handling in loadDictionary().

Change-Id: I5e64d0aba4b1ec7634f4b3ac5537e7a774433ece
main
Ken Wakasa 2011-01-09 16:32:58 +09:00
parent 7a42a46069
commit 90d96615bc
3 changed files with 29 additions and 20 deletions

View File

@ -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

View File

@ -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

View File

@ -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");