Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ZBAR barcode scanning library not working when using target sdk version 23 in gradle

I am using zbar scanner library in my project. After updating to sdk 23 Marshmallow scanner is not working. Following is the gradle file. Scanner is working if I set targetSdkVersion anything other than 23.

Following is the gradle file:

    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 15
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "net.sourceforge.zbar.android.CameraTest"
        minSdkVersion 9
        targetSdkVersion 23
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'),  'proguard-rules.txt'
        }
    }
  }

 dependencies {
    compile files('libs/zbar.jar')
 }

Following is the only line I am getting exception log:

10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: FATAL EXCEPTION: main
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: Process: net.sourceforge.zbar.android.CameraTest, PID: 7719
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/net.sourceforge.zbar.android.CameraTest-2/lib/arm/libiconv.so: has text relocations
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at java.lang.Runtime.loadLibrary(Runtime.java:372)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at java.lang.System.loadLibrary(System.java:1076)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at net.sourceforge.zbar.android.CameraTest.CameraTestActivity.<clinit>(CameraTestActivity.java:54)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at java.lang.Class.newInstance(Native Method)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
10-15 21:19:00.688 804-6706/? W/ActivityManager:   Force finishing activity net.sourceforge.zbar.android.CameraTest/.CameraTestActivity
10-15 21:19:00.700 9581-9650/? E/Surface: getSlotFromBufferLocked: unknown buffer: 0x9664a7f0

How to fix this any help? I want to use tareget sdk 23 for handling camera permissions as per new Marshmallow functionality.

Following are the lines used in code to load libraries:

static {
    System.loadLibrary("iconv");
}
like image 230
alphanso Avatar asked Oct 15 '15 15:10

alphanso


2 Answers

Solution that worked for me is as @Arst has mention in comment of above answer, download jniLibs folder and put it in your application from here. I've also replaced zbar.jar.

like image 83
Chitrang Avatar answered Sep 21 '22 11:09

Chitrang


Your App is crashing because of following reason :

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

This release updates the behavior of the dynamic linker. The dynamic linker now understands the difference between a library’s soname and its path ( public bug 6670), and search by soname is now implemented. Apps which previously worked that have bad DT_NEEDED entries (usually absolute paths on the build machine’s file system) may fail when loaded.

The dlopen(3) RTLD_LOCAL flag is now correctly implemented. Note that RTLD_LOCAL is the default, so calls to dlopen(3) that didn’t explicitly use RTLD_LOCAL will be affected (unless your app explicitly used RTLD_GLOBAL). With RTLD_LOCAL, symbols will not be made available to libraries loaded by later calls to dlopen(3) (as opposed to being referenced by DT_NEEDED entries).

On previous versions of Android, if your app requested the system to load a shared library with text relocations, the system displayed a warning but still allowed the library to be loaded. Beginning in this release, the system rejects this library if your app's target SDK version is 23 or higher. To help you detect if a library failed to load, your app should log the dlopen(3) failure, and include the problem description text that the dlerror(3) call returns. To learn more about handling text relocations, see this guide.

Solution: make a folder lib in your android project inside that make a folder named as armeabi-v7a, put your .so file inside it. then load it via system.load(context.nativeLibraryDir + File.separator + ) , if it fails then use system.loadLibrary().

like image 33
dex Avatar answered Sep 18 '22 11:09

dex