ands UnsatisfiedLinkError: библиотека не найдена - PullRequest
1 голос
/ 27 августа 2011

Я проверил coolreader 3 из репозитория git http://sourceforge.net/projects/crengine/. Я пытаюсь построить его в Eclipse, но при запуске он вылетает со следующей ошибкой:

Приложение Cool Reader (process.org.coolreader) неожиданно остановилось. Пожалуйста, попробуйте еще раз.

Вот красная часть из logcat:

08-27 02:54:24.553: ERROR/AndroidRuntime(223): Uncaught handler: thread BackgroundThread44c32540 exiting due to uncaught exception
08-27 02:54:24.583: ERROR/AndroidRuntime(223): java.lang.UnsatisfiedLinkError: Library cr3engine-45-15 not found
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at java.lang.Runtime.loadLibrary(Runtime.java:489)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at java.lang.System.loadLibrary(System.java:557)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at org.coolreader.crengine.Engine.installLibrary(Engine.java:837)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at org.coolreader.crengine.Engine.init(Engine.java:745)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at org.coolreader.crengine.Engine.access$10(Engine.java:742)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at org.coolreader.crengine.Engine$4.run(Engine.java:565)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at android.os.Handler.handleCallback(Handler.java:587)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at android.os.Looper.loop(Looper.java:123)
08-27 02:54:24.583: ERROR/AndroidRuntime(223):     at org.coolreader.crengine.BackgroundThread.run(BackgroundThread.java:120)

и это функция org.coolreader.crengine.Engine.installLibrary:

private void installLibrary() {
    try {
        if (force_install_library)
            throw new Exception("forcing install");
        // try loading library w/o manual installation
        log.i("trying to load library " + LIBRARY_NAME
                + " w/o installation");
        System.loadLibrary(LIBRARY_NAME);
        // try invoke native method
        //log.i("trying execute native method ");
        //setHyphenationMethod(HYPH_NONE, new byte[] {});
        log.i(LIBRARY_NAME + " loaded successfully");
    } catch (Exception ee) {
        log.i(SO_NAME + " not found using standard paths, will install manually");
        File sopath = mActivity.getDir("libs", Context.MODE_PRIVATE);
        File soname = new File(sopath, SO_NAME);
        try {
            sopath.mkdirs();
            File zip = new File(mActivity.getPackageCodePath());
            ZipFile zipfile = new ZipFile(zip);
            ZipEntry zipentry = zipfile.getEntry("lib/armeabi/" + SO_NAME);
            if (!soname.exists() || zipentry.getSize() != soname.length()) {
                InputStream is = zipfile.getInputStream(zipentry);
                OutputStream os = new FileOutputStream(soname);
                Log.i("cr3",
                        "Installing JNI library "
                                + soname.getAbsolutePath());
                final int BUF_SIZE = 0x10000;
                byte[] buf = new byte[BUF_SIZE];
                int n;
                while ((n = is.read(buf)) > 0)
                    os.write(buf, 0, n);
                is.close();
                os.close();
            } else {
                log.i("JNI library " + soname.getAbsolutePath()
                        + " is up to date");
            }
            System.load(soname.getAbsolutePath());
            //setHyphenationMethod(HYPH_NONE, new byte[] {});
        } catch (Exception e) {
            log.e("cannot install " + LIBRARY_NAME + " library", e);
        }
    }
}

Строка 837 в engine.java:

 System.loadLibrary(LIBRARY_NAME);

LIBRARY_NAME в engine.java устанавливается с помощью:

 static final private String LIBRARY_NAME = "cr3engine-45-15";

Поскольку я скачал код из репозитория, он должен работать без каких-либо изменений. Я не понимаю, почему это не работает.

1 Ответ

1 голос
/ 07 мая 2015

Это не стандартные имена, так как в них отсутствует префикс lib.

System.loadLibrary("lept");
System.loadLibrary("tess");

Это вызывает поиск файла liblept.so, который не является вашим файлом.Либо дайте вашей библиотеке стандартное имя, либо укажите фактическое имя файла, включая путь, в котором он установлен на устройстве, до

System.load(("lept") 
//rather than 
System.loadLibrary().

, если это ошибка неудовлетворительной ссылки , затем не видя ваш кодтолько ваше предположение, что ваш код пытается загрузить разделяемую библиотеку liblept.so , и библиотека по этому пути недоступна.Кроме того, код, который вы используете, либо содержит этот файл liblept.so в любом каталоге lib или внутренней директории пакета, либо вы должны сгенерировать (собрать) эту общую библиотеку, используя Android-NDK , попробуйте выполнить tutorial1 , tutorial2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...