这篇博客应该算是我的第一篇博客,写这篇博客的主要原因是记录在将EasyPR_Android车牌识别移植到本人程序时所遇到的各类问题。
我也是一个自学Android的小白,很多不懂得的也是在自己摸索,如有不正确的地方请多多指正。
最近有一个项目需要用到车牌识别,因为场景比较固定所以使用了开源项目https://github.com/liuruoze/EasyPR 的android移植版本。该作者在移植到Android平台时应该用的是Android Studio 2.1.2版本所以我在将该项目挪到我自己的工程时并未出现任何问题即可使用,这时我用的as是2.3.3版本。没过几天我把as升级到3.6.1后再移植便出现了以下问题。
- 第一 : 报错 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.aiseminar-1/base.apk”],nativeLibraryDirectories=[/data/app/com.aiseminar-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn’t find “libEasyPR.so”
根据我在网上找到的资料,是因为64位机器默认去查找arm64-v8a目录下是否有合适的64位库,如果没有则回去libs下查找32位的库,而fresco的draw-pipeline太完善了考虑了64位的机器所以他的arm64-v8a下有so库,对应的系统就创建了lib64的文件,而不再去找32位的库。
我这里用到的是在bulid.gradle中添加如下代码:
defaultConfig {
applicationId "com.aiseminar"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
添加其中的ndk代码块即可。
来源:https://www.jianshu.com/p/a75cc076480f链接里有更多此问题的解决方案。
- 第二 报错:
E/cv::error(): OpenCV Error: Parsing error (Missing or invalid SVM type) in void cv::ml::SVMImpl::read_params(const cv::FileNode&), file /Volumes/Linux/builds/master_pack-android/opencv/modules/ml/src/svm.cpp, line 2122
这个原因就是因为没有打开该软件的内存读取权限
在AndroidManifest中添加权限 并在设置中打开该软件的权限即可
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 第三 报错:
CreateProcess error=2, 系统找不到指定的文件。
* What went wrong:
Execution failed for task ':app:buildNative'。
A problem occurred starting process 'command 'E:\android_study\android-ndk-r13b/ndk-build''
这里主要是因为在android中 commandLine "$ndkDir/ndk-build"后需要加 “.cmd”如
commandLine "$ndkDir/ndk-build.cmd",
修改路径就是在bulid.gradle中。
- 第四 报错:
找不到initPR(String svmpath, String annpath);方法
这个是因为 PlateRecognizer类需要所在路径的包名为package com.aiseminar.EasyPR; 否则就会报错。
其他文件和代码都是原样照搬 只在有用的地方作出修改,如果你有需要的可以留言我发给你一份。