我需要将条形码扫描器的sdk集成到我的react本机应用程序中,但我一直收到一个错误:

Couldn't load XXX from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mobile-1.apk"],nativeLibraryDirectories=[/data/aoo-lib/com.mobile-1, /system/lib]]]: findLibrary returned null

我所做的:
我下载了sdk的.jar文件并放入app/libs
我在the build.gradle中添加了这一行以获取sdk的路径
dependencies {
  ...
  implementation fileTree(include: ['*.jar'], dir: 'libs')
}

我创建了native module以便能够加载sdk
这是我在CodeBarre.java中的本机模块代码:
package com.myApp;


import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;


import java.util.Map;
import java.util.HashMap;
import android.util.Log;

import com.zebra.adc.decoder.BarCodeReader; // that's the scanner SDK

public class CodeBarre extends ReactContextBaseJavaModule {

public CodeBarre(ReactApplicationContext reactContext) {
  super(reactContext);

}

private static final String TAG = "BarcodeSdkDemo";


@Override
public String getName() {
  return "CodeBarre";
}

// here's how i'm trying to load the SDK
@ReactMethod
public void initScanner(Callback cb) {
  try {
      System.loadLibrary("IAL");
      System.loadLibrary("SDL");
      System.loadLibrary("barcodereader44"); // Android 4.4
      Log.i(TAG, "Barcode scanner drivers loaded");
      cb.invoke("Barcode scanner drivers loaded");
  } catch (Exception e) {
      Log.e(TAG, "error static initialization  block", e);
      cb.invoke(e.toString(), null);
  }
 }
}

这是react-native的一面:
  ...
  componentDidMount() {
    // Access the function created in the java module
    NativeModules.CodeBarre.initScanner((err ,name) => {
      console.log(err, name);
    });
  }

下面是我得到的错误:
android - 无法将Android第三方扫描仪库加载到我的 native 应用程序中-LMLPHP
这是我放在/app/libs中的.jar文件:
android - 无法将Android第三方扫描仪库加载到我的 native 应用程序中-LMLPHP
android - 无法将Android第三方扫描仪库加载到我的 native 应用程序中-LMLPHP
应用程序文件夹中的build.gradle
apply plugin: "com.android.application"

import com.android.build.OutputFile

project.ext.react = [
  entryFile: "index.js"
]

apply from: "../../node_modules/react-native/react.gradle"

android {
  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion

  defaultConfig {
     applicationId "com.mobile"
     minSdkVersion rootProject.ext.minSdkVersion
     targetSdkVersion rootProject.ext.targetSdkVersion
     versionCode 4
     versionName "0.1"
  }

  signingConfigs {
    release {
      if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
          storeFile file(MYAPP_RELEASE_STORE_FILE)
          storePassword MYAPP_RELEASE_STORE_PASSWORD
          keyAlias MYAPP_RELEASE_KEY_ALIAS
          keyPassword MYAPP_RELEASE_KEY_PASSWORD
         }
      }
     }
     splits {
      abi {
       reset()
       enable enableSeparateBuildPerCPUArchitecture
       universalApk false  // If true, also generate a universal APK
       include "armeabi-v7a", "x86", "arm64-v8a"
     }
    }

    buildTypes {
      release {
         minifyEnabled enableProguardInReleaseBuilds
         proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
         signingConfig signingConfigs.release
       }
      }
      // applicationVariants are e.g. debug, release
         applicationVariants.all { variant ->
         variant.outputs.each { output ->
      // For each separate APK per architecture, set a unique version code as described here:
      // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
      def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3]
      def abi = output.getFilter(OutputFile.ABI)
      if (abi != null) {  // null for the universal-debug, universal-release variants
          output.versionCodeOverride =
                versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
     }
    }
  }
 }

    dependencies {
     implementation project(':react-native-device-info')
     implementation project(':react-native-vector-icons')
     implementation fileTree(dir: "libs", include: ["*.jar"])
     implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
     implementation "com.facebook.react:react-native:+"  // From node_modules
    }

    // Run this once to be able to run the application with BUCK
    // puts all compile dependencies into folder libs for BUCK to use
     task copyDownloadableDepsToLibs(type: Copy) {
       from configurations.compile
       into 'libs'
     }

下面是如何加载sdk的说明:
android - 无法将Android第三方扫描仪库加载到我的 native 应用程序中-LMLPHP

最佳答案

专业提示:在请求帮助解决与依赖关系相关的问题时,请始终包含您的成绩文件。
该消息意味着您的应用程序找不到本机库。在android世界,这意味着c库,而不是java库。在安卓世界,你有:
-Java库:JAR文件。与Java世界的其他地方几乎一样。
-android库:aar文件。zip文件,其结构不仅公开jvm字节码,还公开相关的xml文件,如清单文件,以及,取决于gradle插件版本,.so文件。
-本机库:so文件。C程序将由您的代码调用。
你得到的文件是一个普通的罐子。如您所见,它不包含所需的.so文件(“IAL”、“SDL”、“BarcodeReader44”)。如果sdk提供商给了你一个jar文件,他们也必须给你一组.so文件。您需要将这些包含在构建中。下面的答案显示了如何手动执行此操作:
How to include *.so library in Android Studio?
如果缺少.so文件,请向sdk提供程序询问。它们可能看起来像这样:
https://github.com/LeiHuangZ/ScanServiceNew/tree/master/se4710/src/main/jniLibs/arm64-v8a
请记住,每个处理器体系结构都需要不同的.so文件集。
编辑:根据sdk的包名,我猜他们没有发给你的文件是这个:https://github.com/LeiHuangZ/ScanServiceNew/blob/master/se4710/src/main/jniLibs/jniLibs.rar
当你等待他们的回答时,试试这个。请记住,他们并没有为x86提供一个版本,所以只为arm和armv7调整apk分割。
编辑:
谷歌缓存是你的朋友。你在用famoco的sdk,对吧?是吗?
https://webcache.googleusercontent.com/search?q=cache:iJQugfLm27wJ:https://help.famoco.com/developers/sample-code/fx300-imager/+&cd=2&hl=en&ct=clnk&gl=us
问题是,他们的sdk是为他们的设备设计的。c库是其中的一部分。我猜你不是在用一个非famoco设备测试,就是有人给你发送了一个sdk,假设它可以工作,但它不会,除非他们给你发送c文件,或者一个famoco设备。事实上,法莫科的测试项目表明:
/**
*此应用程序测试FX300上的条形码扫描仪。
*它依赖于包含以下共享库的图像:
*系统/库/
*/
伙计,你知道答案了。要么得到一个著名的fx300,要么放弃sdk。

关于android - 无法将Android第三方扫描仪库加载到我的 native 应用程序中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55472437/

10-11 22:16
查看更多