5

In my android project I am using an external jar library which utilizes a runtime library libiconv.so. I have the library included in my project's lib directory. The library is included for all three architectures in the following directory hirarcy.

libs>
armeabi>libiconv.so
armeabi-v7a>libiconv.so
x86>libiconv.so

But I am getting Exceptions as logged by log cat:

05-23 12:18:58.857    3081-3081/?                              E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.ExceptionInInitializerError
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1319)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
        at android.app.ActivityThread.access$600(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libiconv.so from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.tariq.buynow-1.apk,libraryPath=/data/app-lib/com.tariq.buynow-1]: findLibrary returned null
        at java.lang.Runtime.loadLibrary(Runtime.java:365)
        at java.lang.System.loadLibrary(System.java:535)
        at com.tariq.buynow.CameraActivity.<clinit>(CameraActivity.java:30)

Where at CameraActivity.java:30 is:

static { System.loadLibrary("libiconv.so"); }

I have also tried

static { System.loadLibrary("iconv"); }

Is it some thing to do with gradle configuration, as I am new to Android Studio, or the error source is something else?

Rachel Gallen
  • 27,943
  • 21
  • 72
  • 81
Tariq
  • 2,489
  • 11
  • 36
  • 61

3 Answers3

5

I had this same problem trying to use ZBar SDK. You most likely need to edit your build.gradle to make sure that the native libraries are included in your APK. This is how I fixed your problem: https://stackoverflow.com/a/16993006/2221876

Community
  • 1
  • 1
Michael Lawrie
  • 1,534
  • 11
  • 20
  • 7
    on latest version of Android Studio you just the native libraries in `src/main/jniLibs` and gradle will do the rest. – samael Jan 26 '14 at 11:01
0

System.loadLibrary() looks in in the lib directories of the device, not the application. To do what you want you'll need to copy the lib from the app onto the phone's file system, and load it from there. I would suggest putting the libs in /res/raw/ and do it this way:

try {
    // Point the input stream to the library in /res/raw
    InputStream is = context.getResources().openRawResource(R.raw.libiconv);
    // Create a BufferedInputStream from the InputStream
    BufferedInputStream bis = new BufferedInputStream(is);
    // Set the FileOutputStream to the app's data directory
    FileOutputStream fos = context.openFileOutput("libiconv.so", Context.MODE_PRIVATE);

    byte data[] = new byte[1024];
    int count;
    while ((count = bis.read(data, 0, 1024)) != -1) {
        fos.write(data, 0, count);
    }
    fos.close();
    bis.close();
    is.close();

    System.load(context.getFilesDir() + "/libiconv.so");

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException ie) {
    ie.printStackTrace();
}

This may not work exactly, but the general gist of this should.

DenWav
  • 53
  • 1
  • 11
0

Add the following line into your build.gradle scripts

jniLibs.srcDirs = ['libs'] // copy the *.so to package

In the project view, you must can see : Module/libs/ABI NAME/*.so

Merlin
  • 1