簡體   English   中英

無法將 android 第三方掃描儀庫加載到我的本機應用程序中

[英]unable to load an android third party scanner library into my react native app

我需要將條形碼掃描儀的 SDK 集成到我的 react-native 應用程序中,但我不斷收到錯誤消息:

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

我做了什么:

  1. 我下載了 SDK 的.jar文件,然后放入app/libs

  2. 我在the build.gradle添加了這一行來獲取 SDK 的路徑

dependencies {
  ...
  implementation fileTree(include: ['*.jar'], dir: 'libs')
}
  1. 我創建了能夠加載 SDK 的native module

這是我在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);
  }
 }
}
  1. 這是本機react-native一面:
  ...
  componentDidMount() {
    // Access the function created in the java module
    NativeModules.CodeBarre.initScanner((err ,name) => {
      console.log(err, name);
    });
  }
  1. 這是我得到的錯誤: 在此處輸入圖片說明

  2. 這是我放在 /app/libs 中的 .jar 文件: 在此處輸入圖片說明 在此處輸入圖片說明

  3. app文件夾中的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 eg 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' }
  4. 以下是如何加載 SDK 的說明: 在此處輸入圖片說明

專業提示:在尋求與依賴性相關問題的幫助時,請始終包括您的成績文件。

該消息意味着您的應用程序無法找到本機庫 在 android 世界中,這意味着 C 庫,而不是 java 庫。 在安卓世界,你有:

-Java 庫:JAR 文件。 與 Java 世界中的其他任何地方幾乎相同。

-Android 庫:AAR 文件。 具有結構的 Zip 文件不僅會暴露 JVM 字節碼,還會暴露相關的 XML 文件,例如清單文件,以及取決於 gradle 插件版本的 .so 文件。

-本機庫:SO 文件。 由您的代碼調用的 C 程序。

你得到的文件是一個普通的 jar。 如您所見,它不包含您需要的 .so 文件(“IAL”、“SDL”、“barcodereader44”)。 如果 SDK 提供者給了你一個 jar 文件,他們也必須給你一組上述的 .so 文件。 您需要在構建中包含這些。 以下答案顯示了如何手動執行此操作: 如何在 Android Studio 中包含 *.so 庫?

如果您缺少 .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 設備。 事實上,Famoco 的測試項目指出:

/** * 此應用程序測試 FX300 上的條碼掃描器。 * 它依賴於包含共享庫的鏡像: * system/lib/ */

所以伙計,你得到了答案。 要么獲得 Famoco FX300,要么放棄 sdk。

解決方案

  1. 制作您的包裹。

當您從 android 將本機模塊添加到 React Native 時,您需要按如下方式注冊您的模塊。

// CustomToastPackage.java

package com.your-app-name;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CustomToastPackage implements ReactPackage {

  @Override
  public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
  }

  @Override
  public List<NativeModule> createNativeModules(
                              ReactApplicationContext reactContext) {
    List<NativeModule> modules = new ArrayList<>();

    modules.add(new ToastModule(reactContext));

    return modules;
  }

}

如果您不注冊該模塊,它將返回null

  1. 在 MainApplication.java 中初始化您的模塊
// MainApplication.java

...
import com.your-app-name.CustomToastPackage; // <-- Add this line with your package name.
...

protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
            new MainReactPackage(),
            new CustomToastPackage()); // <-- Add this line with your package name.
}

官方的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM