我需要将条形码扫描器的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);
});
}
下面是我得到的错误:
这是我放在/app/libs中的.jar文件:
应用程序文件夹中的
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世界,这意味着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/