什么是 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 的 gcc 编译错误 cv.h

未找到 MultiDexApplication 类

使用 OpenCV 3.0.0 的 Qt 5.6 未找到 DLL 入口点

Qt 与 OpenCV:LNK2019:未解析的外部符号和未找到文件 mainwindow.obj

我无法使用 VS2010 运行 openCV2.3.1,因为未找到 opencv_core231d.dll

未找到 Android Studio 'opencv2/core/core.hpp' 文件