Что такое ошибка «Не найден нативный метод» с OpenCV в API 19? - PullRequest
0 голосов
/ 01 декабря 2019

Я реализовал openCv в моем проекте Android, проект работает на устройстве с 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 Ответ

0 голосов
/ 01 декабря 2019

Немного подробного описания кода, в котором вы назвали 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");
            }
        }

Попробуйте, таким образом, это должно определенно работать.

...