什么是 API 19 中 OpenCV 的“未找到本机方法”错误?
Posted
技术标签:
【中文标题】什么是 API 19 中 OpenCV 的“未找到本机方法”错误?【英文标题】:What is "Native method not found" bug with OpenCV in api 19? 【发布时间】:2020-03-26 07:11:47 【问题描述】:我在我的 android 项目中实现了 openCv,项目在具有 api 23 的设备上正确运行。
但只是这个项目在使用 api 19 的设备上崩溃了。原因:
java.lang.UnsatisfiedLinkError:找不到本机方法: org.opencv.core.Mat.n_Mat:()J
那么问题来了,api 19 不能支持openCV? 要么 api 19 对 openCV 有不同的配置吗?
这是我项目的主要部分:
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OpenCVLoader.initDebug();
public void medianFilter(View view)
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; // Leaving it to true enlarges the decoded image size.
Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
Mat img1 = new Mat();
Utils.bitmapToMat(original, img1);
Mat medianFilter = new Mat();
Imgproc.cvtColor(img1, medianFilter, Imgproc.COLOR_RGB2RGBA);
Imgproc.median(medianFilter, medianFilter, 9);
Bitmap imgBitmap = Bitmap.createBitmap(medianFilter.cols(), medianFilter.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(medianFilter, imgBitmap);
ImageView imageView = findViewById(R.id.opencvImg);
imageView.setImageBitmap(imgBitmap);
【问题讨论】:
【参考方案1】:对您调用 medianFilter()
的代码进行更多描述可能会提供更多信息,但根据您提到的代码。
我建议在onResume()
中形成如下代码:
@Override
public void onResume()
super.onResume();
if (!OpenCVLoader.initDebug())
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
else
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
补充我之前给出的答案
我将尝试合并以下我尝试解决的问题:
我试着用LoaderCallbackInterface
做一些技巧:
public class LoaderCallBackHelper: Java.Lang.Object,ILoaderCallbackInterface
public void OnManagerConnected(int p0)
switch (p0)
case LoaderCallbackInterface.Success:
System.Console.WriteLine("Success");
break;
default:
this.OnManagerConnected(p0);
break;
public void OnPackageInstall(int p0, IInstallCallbackInterface p1)
p1.Install();
System.Console.WriteLine(p1.PackageName);
然后是这样的(在 MainActivity 上):
ILoaderCallbackInterface t = new LoaderCallBackHelper();
public MainActivity()
if(OpenCVLoader.InitAsync(OpenCVLoader.OpencvVersion3000,this,t))
System.Console.WriteLine("OK");
问题仍未解决。
然后我尝试了一些技巧
public class BaseLoaderHelper : BaseLoaderCallback
public BaseLoaderHelper(Context context):base(context)
BaseLoaderCallback _t = new BaseLoaderHelper(this);
if(OpenCVLoader.InitAsync(OpenCVLoader.OpencvVersion3000,this,_t))
System.Console.WriteLine("OK");
仍然遇到您收到的相同错误。
我对此的最终解决方案是,我下载了 OpenCV 版本 2.4.11 并重新安装到我的项目中。现在一切正常:
public MainActivity()
if (!OpenCVLoader.InitDebug())
System.Console.WriteLine("Failed to INIT \n OpenCV Failure");
else
System.Console.WriteLine("OpenCV INIT Success");
试试这个方法肯定可以的。
【讨论】:
感谢您的回复。通过添加这些行,应用程序崩溃解决了,但现在 openCv 管理器存在另一个问题,该问题在 google play 中未找到且未找到。 @SadeQdigitALLife 您能否在您提出的“更新代码”问题中添加您收到的错误 我在我的问题中写了错误文本。这里是:java.lang.UnsatisfiedLinkError:找不到本机方法:org.opencv.core.Mat.n_Mat:()J 嗨@SadeQdigitALLife 检查上面的答案,我已经用我试图解决这个问题的任何方法为你更新了它。希望现在能解决这个问题。以上是关于什么是 API 19 中 OpenCV 的“未找到本机方法”错误?的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenCV 3.0.0 的 Qt 5.6 未找到 DLL 入口点
Qt 与 OpenCV:LNK2019:未解析的外部符号和未找到文件 mainwindow.obj