- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这几天我正在尝试构建 OpenALPR example project for Android .它构建并启动,但在调用 native 方法以识别它之后会出现异常:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:838)
Caused by: java.lang.UnsatisfiedLinkError: Native method not found: org.openalpr.AlprJNIWrapper.recognizeWithCountryRegionNConfig:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
at org.openalpr.AlprJNIWrapper.recognizeWithCountryRegionNConfig(Native Method)
at org.openalpr.app.AlprFragment$AlprTask.doInBackground(AlprFragment.java:78)
at org.openalpr.app.AlprFragment$AlprTask.doInBackground(AlprFragment.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
... 4 more
我什么都做不了,它总是出现。
应用程序.mk
APP_ABI := armeabi-v7a
APP_CPPFLAGS := -frtti -fexceptions
APP_STL := gnustl_static
在我所有尝试之后的 Android.mk
LOCAL_PATH := $(call my-dir)
LIB_PATH := $(LOCAL_PATH)/../libs/armeabi-v7a
include $(CLEAR_VARS)
LOCAL_MODULE := leptonica
LOCAL_SRC_FILES := 3rdparty/liblept.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := tesseract
LOCAL_SRC_FILES := 3rdparty/libtess.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := simpleini
LOCAL_SRC_FILES := 3rdparty/libsimpleini.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := support
LOCAL_SRC_FILES := 3rdparty/libsupport.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := openalpr
LOCAL_SRC_FILES := 3rdparty/libopenalpr-static.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
include d:\Other\robovisor_mobile\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
LOCAL_MODULE := openalpr-native
SOURCE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
HEADER_LIST := $(wildcard $(LOCAL_PATH)/*.h)
LOCAL_SRC_FILES := AlprJNIWrapper.cpp
LOCAL_SRC_FILES += $(HEADER_LIST:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(SOURCE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_EXPORT_C_INCLUDES += /home/sujay/builds/src/openalpr/src/openalpr
LOCAL_EXPORT_C_INCLUDES += /home/sujay/builds/src/OpenCV-2.4.9-android-sdk/sdk/native/include
FILE_LIST := $(foreach dir, $(LOCAL_EXPORT_C_INCLUDES), $(wildcard $(dir)/*.cpp))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES += /home/sujay/builds/src/openalpr/src/openalpr
LOCAL_C_INCLUDES += /home/sujay/builds/src/OpenCV-2.4.9-android-sdk/sdk/native/include
LOCAL_C_INCLUDES += /home/sujay/tools/android-ndk-r10/platforms/android-19/arch-arm/usr/include
LOCAL_SHARED_LIBRARIES += tesseract leptonica
LOCAL_STATIC_LIBRARIES += openalpr support simpleini
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
AlprJNIWrapper.cpp 包含我需要的原生函数
/**
* Created by sujay on 13/11/14.
*/
#include <string>
#include <sstream>
#include <cstdio>
#include <iostream>
// openCV includes
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
// open alpr includes
#include "support/filesystem.h"
#include "support/timing.h"
#include "alpr.h"
#include "cjson.h"
#include "AlprJNIWrapper.h"
#include "AlprNative.h"
using namespace alpr;
JNIEXPORT jstring JNICALL Java_org_openalpr_AlprJNIWrapper_recognize(JNIEnv *env,
jobject object, jstring jimgFilePath, jint jtopN)
{
jstring defaultCountry = env->NewStringUTF("us");
jstring defaultRegion = env->NewStringUTF("");
jstring defaultConfigFilePath = env->NewStringUTF(CONFIG_FILE);
return _recognize(env, object, defaultCountry, defaultRegion, jimgFilePath, defaultConfigFilePath, jtopN);
}
JNIEXPORT jstring JNICALL Java_org_openalpr_AlprJNIWrapper_recognizeWithCountryNRegion(
JNIEnv *env, jobject object, jstring jcountry,
jstring jregion, jstring jimgFilePath, jint jtopN)
{
jstring defaultConfigFilePath = env->NewStringUTF(CONFIG_FILE);
return _recognize(env, object, jcountry, jregion, jimgFilePath, defaultConfigFilePath, jtopN);
}
JNIEXPORT jstring JNICALL Java_org_openalpr_AlprJNIWrapper_recognizeWithCountryRegionNConfig
(JNIEnv *env, jobject object, jstring jcountry, jstring jregion,
jstring jimgFilePath, jstring jconfigFilePath, jint jtopN)
{
return _recognize(env, object, jcountry, jregion, jimgFilePath, jconfigFilePath, jtopN);
}
jstring _recognize(JNIEnv *env, jobject object,
jstring jcountry, jstring jregion, jstring jimgFilePath,
jstring jconfigFilePath, jint jtopN)
{
const char* countryChars = env->GetStringUTFChars(jcountry, NULL);
std::string country(countryChars);
env->ReleaseStringUTFChars(jcountry, countryChars);
if(country.empty())
{
country = "us";
}
const char* configFilePathChars = env->GetStringUTFChars(jconfigFilePath, NULL);
std::string configFilePath(configFilePathChars);
env->ReleaseStringUTFChars(jconfigFilePath, configFilePathChars);
if(configFilePath.empty())
{
configFilePath = "/etc/openalpr/openalpr.conf";
}
const char* imgFilePath = env->GetStringUTFChars(jimgFilePath, NULL);
int topN = jtopN;
std::string response = "";
cv::Mat frame;
Alpr alpr(country, configFilePath);
const char* regionChars = env->GetStringUTFChars(jregion, NULL);
std::string region(regionChars);
env->ReleaseStringUTFChars(jregion, regionChars);
if(region.empty())
{
alpr.setDetectRegion(true);
alpr.setDefaultRegion(region);
}
alpr.setTopN(topN);
if (alpr.isLoaded() == false) {
env->ReleaseStringUTFChars(jimgFilePath, imgFilePath);
response = errorJsonString("Error initializing Open Alpr");
return env->NewStringUTF(response.c_str());
}
if(fileExists(imgFilePath))
{
frame = cv::imread(imgFilePath);
response = detectandshow(&alpr, frame, "");
}
else
{
response = errorJsonString("Image file not found");
}
env->ReleaseStringUTFChars(jimgFilePath, imgFilePath);
return env->NewStringUTF(response.c_str());
}
JNIEXPORT jstring JNICALL Java_org_openalpr_AlprJNIWrapper_version
(JNIEnv *env, jobject object)
{
return env->NewStringUTF(Alpr::getVersion().c_str());
}
std::string detectandshow(Alpr* alpr, cv::Mat frame, std::string region)
{
std::vector < uchar > buffer;
std::string resultJson = "";
cv::imencode(".bmp", frame, buffer);
std::vector < char > buffer1;
for(std::vector < uchar >::iterator i = buffer.begin(); i < buffer.end(); i++) {
buffer1.push_back(*i);
}
timespec startTime;
getTimeMonotonic(&startTime);
//std::vector < AlprResults > results = alpr->recognize(buffer);
AlprResults results = alpr->recognize(buffer1);
timespec endTime;
getTimeMonotonic(&endTime);
double totalProcessingTime = diffclock(startTime, endTime);
//if (results.size() > 0)
{
resultJson = alpr->toJson(results/*, totalProcessingTime*/);
}
return resultJson;
}
std::string errorJsonString(std::string msg)
{
cJSON *root;
root = cJSON_CreateObject();
cJSON_AddTrueToObject(root, "error");
cJSON_AddStringToObject(root, "msg", msg.c_str());
char *out;
out = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
std::string response(out);
free(out);
return response;
}
AlprJNIWrapper.java 调用本地方法
/**
*
*/
package org.openalpr;
/**
* @author sujay
*
*/
public class AlprJNIWrapper implements Alpr {
static {
System.loadLibrary("lept");
System.loadLibrary("tess");
System.loadLibrary("opencv_java");
System.loadLibrary("openalpr-native");
}
/* (non-Javadoc)
* @see org.openalpr.Alpr#recognize(java.lang.String, int)
*/
@Override
public native String recognize(String imgFilePath, int topN);
/* (non-Javadoc)
* @see org.openalpr.Alpr#recognizeWithCountryNRegion(java.lang.String, java.lang.String, java.lang.String, int)
*/
@Override
public native String recognizeWithCountryNRegion(String country, String region,
String imgFilePath, int topN);
/* (non-Javadoc)
* @see org.openalpr.Alpr#recognizeWithCountryRegionNConfig(java.lang.String, java.lang.String, java.lang.String, java.lang.String, int)
*/
@Override
public native String recognizeWithCountryRegionNConfig(String country,
String region, String imgFilePath, String configFilePath, int topN);
/*
* (non-Javadoc)
* @see org.openalpr.Alpr#version()
*/
@Override
public native String version();
}
已编辑
我的手机上有关于处理器的信息。
Processor : ARMv7 Processor rev 3 (v7l)
processor : 0
BogoMIPS : 1993.93
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4
idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 3
再次编辑
我试图在结果 .so
文件中获取有关函数的信息,结果如下:
Symbol table '.dynsym' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_finalize
2: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit
3: 00002004 0 NOTYPE GLOBAL DEFAULT ABS _edata
4: 00002004 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
5: 00002004 0 NOTYPE GLOBAL DEFAULT ABS _end
我从:
<ndk_path>\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\bin>arm-linux-androideabi-readelf.exe
-Ws <projects_path>\libs\armeabi-v7a\libopenalpr-native.so
我做错了吗?或者 .so
文件中真的没有我的函数?
最佳答案
可能有几个问题。
首先,您在不受支持的设备上运行示例,例如为 armeabi-v7 构建的 lib(由于 make 文件中的 APP_ABI := armeabi-v7a
设置肯定如此)并且您的设备是 intel x86 或低于7 armeabi版本等
可能是示例在 lib 项目已更新时已过时,因此某些方法名称已更改或方法已被删除,等等。
还编译的 NDK 库对包敏感,因此如果您将 JNI 类放入不同的包中,它也不会工作。
此外,必须将 native 库 .so-file 放置到项目的正确位置,而不是通常放置 jar-libs 的 libs 文件夹。它与 android studio 有点不同:
...\src\main\jniLibs\aremabi-v7a\libYourLib.so (for aremabi-v7a version)
...\src\main\jniLibs\x86\libYourLib.so (for x86 version and so on)
更新:
不要忘记尊重最低 API 级别,即 19。应用程序无法在 API 级别较低的设备上运行,我的意思是您可以在项目中更改最低 API 级别 - 不要这样做。
这里的问题是 libopenalpr-native.so
在其名称中有一个破折号 -
字符。 Dash 是 AOS 中资源命名的受限字符。所以我用“_”和app works now替换了它并在这里替换它:
System.loadLibrary("openalpr_native");
而且我没有使用您的 .so 版本,而只使用了项目一中包含的版本。
更新
看一看:http://prntscr.com/6w6qfx与原始的 1.7Mb 相比,您的库只有 5kb,肯定有问题。它在评论中解释了您的问题:
Why there is no error on System.loadLibrary("openalpr-native");? Ijust can't understand this situation - creates libopenalpr-native.sofile, it loads to program, by there is no method.
您可以只使用示例项目中包含的原始库吗?只是为了测试。
关于java - Unsatisfiedlinkerror OpenALPR 安卓测试项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512673/
我正在尝试在 Laravel Homestead (Ubuntu 18.04) 上安装 OpenALPR。首先我尝试了 The Easiest Way .我正在尝试运行: Error opening
我正在使用 OpenALPR,我已经训练 OCR 识别强制字体。当我尝试使用经过训练的数据时,alpr 退出并出现段错误。 我使用的是 1.2.0 版和 tesseract 3.03,以及 lepto
我正在尝试使用带有 IP 摄像头的 openalpr + python 检测车牌,但出现以下错误: openalpr 版本是开源的。 我已经尝试过 recognize_file 函数,没有成功 Fat
我尝试使用 PyQt 和 openalpr 构建一个 GUI 应用程序,但我的代码存在问题。一个简单的例子: from openalpr import Alpr from PyQt4 import Q
这几天我正在尝试构建 OpenALPR example project for Android .它构建并启动,但在调用 native 方法以识别它之后会出现异常: java.lang.Runtime
在 Ubuntu 18.04 上,我成功安装了 openalpr 并对其进行了测试。现在我想用python来调用它。为此,我安装了 https://pypi.org/project/openalpr/
我想在我的 android 项目中使用开放式 alpr(自动车牌识别)库。我成功地编译了所有内容,现在是时候在应用程序中使用 open alpr 但是...... 要正确创建 Alpr 类对象,我必须
我正在使用 Windows 10,我想安装 openalpr 并将库导入 python。 但是,在下载了预编译的 Windows 二进制文件之后,我不知道如何在 python 中导入 alpr 我按照
我需要将 OpenALPR 库集成到我的 C++ 程序中。不幸的是,我无法进行链接工作。 openalpr.lib 在 C:\path\to\alpr 中,alpr.h 头文件在 C:\path\to
尝试为 OSX 编译 openalpr,出现错误: [ 62%] Building CXX object misc_utilities/CMakeFiles/openalpr-utils-classi
有没有办法使用 NDK (ndk-build) 为 Android 编译库 OpenALPR ( https://github.com/openalpr/openalpr)? 最佳答案 这是为 and
我正在与 OpenALPR 合作与Python脚本。来自 argparse 参数的输入图像,每当我从命令提示符运行时,它都会给出输出并显示带有错误的对话框 "python has stopped wo
我刚刚开始使用 Raspberry PI 3。我正在尝试在其上安装一个名为 OpenALPR 的开源库。它是一个以车辆牌照图像作为参数并返回写在上面的文本的库。我一直在关注此链接来安装该库。 http
我正在使用 https://github.com/twelve17/openalpr-ios 该库用于分析车牌图像并从中获取车牌号。 当我尝试在 mac 中运行 ruby 脚本以生成 openap
我最近使用 brew install openalpr 在我的 mac 上成功安装了 openalpr。我想将 openalpr 库与 python 2.7 一起使用,但我在绑定(bind)两者时遇到
当使用 try/catch 语句进行 var data 声明时,即使有车牌,程序也会输出“No License Plate Found”。如果删除 try/catch 语句,则当帧中没有车牌时,程序可
我是一名优秀的程序员,十分优秀!