android UnsatisfiedLinkError: Library not found
Asked Answered
S

1

1

I checked out coolreader 3 from git repository http://sourceforge.net/projects/crengine/. I try to build it in eclipse, but when running it crashes with the following error:

The application Cool Reader (process.org.coolreader) has stopped unexpectedly. Please try again.

Here is the red part from 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)

and this is the function 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);
        }
    }
}

The line 837 in engine.java:

 System.loadLibrary(LIBRARY_NAME);

LIBRARY_NAME in engine.java is set by:

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

Since I downloaded the code from repository it is supposed to work without any modifications. I don't understand why it's not working.

Scarlatina answered 27/8, 2011 at 3:47 Comment(0)
P
1

Those are not standard names, as they lack the lib prefix.

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

This is causes search for liblept.so which is not the file you have. Either give your library the standard name, or specify an actual file name including the path where it ends up installed on the device to

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

if it's unsatisfiedlink error then Without seeing your code just only assumption is your code trying to load shared library liblept.so and the library is not available at that path. Also the code you are using is either have that liblept.so file in any lib or internal package directory or you have to generate (build) that shared library by using Android-NDK try following tutorial1 , tutorial2

Piroshki answered 7/5, 2015 at 10:58 Comment(1)
Thanks. I asked this question 4 years ago while working on something. Ever since I haven't been programming android until recently. Thanks anyway it seems helpful. Also I like to read the tutorials mentioned.Scarlatina

© 2022 - 2024 — McMap. All rights reserved.