[英]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
我做了什么:
我下載了 SDK 的.jar
文件,然后放入app/libs
我在the build.gradle
添加了這一行來獲取 SDK 的路徑
dependencies {
...
implementation fileTree(include: ['*.jar'], dir: 'libs')
}
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);
}
}
}
react-native
一面: ...
componentDidMount() {
// Access the function created in the java module
NativeModules.CodeBarre.initScanner((err ,name) => {
console.log(err, name);
});
}
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' }
專業提示:在尋求與依賴性相關問題的幫助時,請始終包括您的成績文件。
該消息意味着您的應用程序無法找到本機庫。 在 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,對嗎??
問題是,他們的 SDK 是為他們的設備設計的。 C 庫是其中的一部分。 我猜您要么是在使用非 famoco 設備進行測試,要么有人只是向您發送了 SDK,假設它可以工作,但它不會,除非他們向您發送 C 文件或 famoco 設備。 事實上,Famoco 的測試項目指出:
/** * 此應用程序測試 FX300 上的條碼掃描器。 * 它依賴於包含共享庫的鏡像: * system/lib/ */
所以伙計,你得到了答案。 要么獲得 Famoco FX300,要么放棄 sdk。
當您從 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
。
// 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.