4

I'm trying to add a English dictionary to the keyboard. So far I have:

  • Checked-out the source from google
  • Imported the java folder into eclipse as an existing code
  • Added support libraries

I'm able to run and build the code, but when I select the keyboard it crashes (I have not yet added the English or other dictionary). The error message is as follows:

FATAL EXCEPTION: InitializeBinaryDictionary
android.content.res.Resources$NotFoundException: File res/raw/main_en.dict from drawable resource ID #0x7f070003
at android.content.res.Resources.openRawResourceFd(Resources.java:1082)
at com.android.inputmethod.latin.BinaryDictionaryGetter.loadFallbackResource(BinaryDictionaryGetter.java:92)
at com.android.inputmethod.latin.BinaryDictionaryGetter.getDictionaryFiles(BinaryDictionaryGetter.java:328)
at com.android.inputmethod.latin.DictionaryFactory.createMainDictionaryFromManager(DictionaryFactory.java:55)
at com.android.inputmethod.latin.DictionaryFactory.createMainDictionaryFromManager(DictionaryFactory.java:83)
at com.android.inputmethod.latin.Suggest$1.run(Suggest.java:115)
Caused by: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
at android.content.res.AssetManager.openNonAssetFdNative(Native Method)
at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:429)
at android.content.res.Resources.openRawResourceFd(Resources.java:1079)
... 5 more

The relevant methods in the callstack are below:

public static ArrayList<AssetFileAddress> getDictionaryFiles(final Locale locale,
        final Context context) {

    final boolean hasDefaultWordList = DictionaryFactory.isDictionaryAvailable(context, locale);
    BinaryDictionaryFileDumper.cacheWordListsFromContentProvider(locale, context,
            hasDefaultWordList);
    final File[] cachedWordLists = getCachedWordLists(locale.toString(), context);
    final String mainDictId = DictionaryInfoUtils.getMainDictId(locale);
    final DictPackSettings dictPackSettings = new DictPackSettings(context);

    boolean foundMainDict = false;
    final ArrayList<AssetFileAddress> fileList = CollectionUtils.newArrayList();
    // cachedWordLists may not be null, see doc for getCachedDictionaryList
    for (final File f : cachedWordLists) {
        final String wordListId = DictionaryInfoUtils.getWordListIdFromFileName(f.getName());
        final boolean canUse = f.canRead() && hackCanUseDictionaryFile(locale, f);
        if (canUse && DictionaryInfoUtils.isMainWordListId(wordListId)) {
            foundMainDict = true;
        }
        if (!dictPackSettings.isWordListActive(wordListId)) continue;
        if (canUse) {
            final AssetFileAddress afa = AssetFileAddress.makeFromFileName(f.getPath());
            if (null != afa) fileList.add(afa);
        } else {
            Log.e(TAG, "Found a cached dictionary file but cannot read or use it");
        }
    }

    if (!foundMainDict && dictPackSettings.isWordListActive(mainDictId)) {
        final int fallbackResId =
                DictionaryInfoUtils.getMainDictionaryResourceId(context.getResources(), locale);
        final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId);
        if (null != fallbackAsset) {
            fileList.add(fallbackAsset);
        }
    }

    return fileList;
}


public static AssetFileAddress loadFallbackResource(final Context context,
        final int fallbackResId) {
    String str = context.getApplicationInfo().sourceDir;
    AssetFileDescriptor   afd = context.getResources().openRawResourceFd(fallbackResId);
    if (afd == null) {
        Log.e(TAG, "Found the resource but cannot read it. Is it compressed? resId="
                + fallbackResId);
        return null;
    }
    try {
        return AssetFileAddress.makeFromFileNameAndOffset(str, afd.getStartOffset(),
                afd.getLength());
    } finally {
        try {
            afd.close();
        } catch (IOException e) {
            // Ignored
        }
    }
}

I am using ADT 22 download from developer.goole.com

The problem is that there is no dictionary (not even the EN), so the swipe is not working. When I open the Add-on dictionaries there is "No dictionaries available" message in the list.

I'm testing on Samsung Galaxy Nexus with stock 4.3 rom and Nexus One Rom cook 4.0.4

I'm developing on Ubuntu 12.04.3 LTS

Any idea what could be the problem?

Taifun
  • 6,165
  • 17
  • 60
  • 188
NamNd
  • 41
  • 2
  • I trying using ant, but not work! – NamNd Oct 07 '13 at 08:41
  • I am having the same problem, I think it may be related to the native method calls in getDictionaryFiles, rather than the loadFallbackResource method. I have edited your question to show that code as well. – Logan Bissonnette Sep 15 '14 at 19:46
  • @NamNd I am facing the same issue. Also not able to generate .so file. I run the project without .so file, I am facing the same issue as you are facing in loadFallbackResource() method. Did you find any solution ? Anybody can help us please ? – Smeet Aug 10 '16 at 11:26

0 Answers0