在gradle

时间:2015-10-15 15:44:33

标签: android sdk android-6.0-marshmallow zbar zbar-sdk

我在我的项目中使用zbar扫描程序库。更新到sdk 23后,Marshmallow扫描仪无法正常工作。以下是gradle文件。如果我将targetSdkVersion设置为23以外的任何其他内容,则扫描程序正在工作。

以下是gradle文件:

    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')
 }

以下是我获得异常日志的唯一一行:

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

如何解决这个问题呢? 我想根据新的Marshmallow功能使用tareget sdk 23来处理相机权限。

以下是代码中用于加载库的行:

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

3 个答案:

答案 0 :(得分:3)

对我有用的解决方案是@Arst在上述答案的评论中提到,下载jniLibs文件夹并将其从here放入您的应用程序中。我也取代了zbar.jar。

答案 1 :(得分:2)

您的应用因以下原因而崩溃:

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

此版本更新动态链接器的行为。动态链接器现在理解库的soname和它的路径之间的区别(公共错误6670),现在实现了soname搜索。以前工作过的具有错误DT_NEEDED条目的应用程序(通常是构建机器文件系统上的绝对路径)在加载时可能会失败。

现在正确实现了dlopen(3)RTLD_LOCAL标志。请注意,RTLD_LOCAL是默认值,因此对未明确使用RTLD_LOCAL的dlopen(3)的调用将受到影响(除非您的应用明确使用了RTLD_GLOBAL)。使用RTLD_LOCAL时,符号将不会被稍后调用dlopen(3)加载的库使用(而不是被DT_NEEDED条目引用)。

在以前的Android版本中,如果您的应用要求系统加载带文本重定位的共享库,系统会显示警告但仍允许加载库。从此版本开始,如果您的应用的目标SDK版本为23或更高版本,系统会拒绝此库。为了帮助您检测库是否无法加载,您的应用程序应记录dlopen(3)失败,并包含dlerror(3)调用返回的问题描述文本。要了解有关处理文本重定位的更多信息,请参阅本指南。

解决方案: 在你的android项目中创建一个文件夹lib,创建一个名为armeabi-v7a的文件夹,将你的.so文件放入其中。然后通过system.load(context.nativeLibraryDir + File.separator +)加载它,如果失败则使用system.loadLibrary()。

答案 2 :(得分:0)

试试这个QRCodeReader for android api 23(6.0 Marshmallow) 这很好用。根据要求添加相机权限。 https://github.com/dlazaro66/QRCodeReaderView

public class DecoderActivity extends Activity实现OnQRCodeReadListener {

private TextView myTextView;
private QRCodeReaderView mydecoderview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_decoder);

    mydecoderview = (QRCodeReaderView) findViewById(R.id.qrdecoderview);
    mydecoderview.setOnQRCodeReadListener(this);

    myTextView = (TextView) findViewById(R.id.exampleTextView);
}


// Called when a QR is decoded
// "text" : the text encoded in QR
// "points" : points where QR control points are placed
@Override
public void onQRCodeRead(String text, PointF[] points) {
    myTextView.setText(text);
}


// Called when your device have no camera
@Override
public void cameraNotFound() {

}

// Called when there's no QR codes in the camera preview image
@Override
public void QRCodeNotFoundOnCamImage() {

}

@Override
protected void onResume() {
    super.onResume();
    mydecoderview.getCameraManager().startPreview();
}

@Override
protected void onPause() {
    super.onPause();
    mydecoderview.getCameraManager().stopPreview();
}

}