【问题标题】:OpenCV 3.0.0 Android native method not found: org.opencv.core.Mat.n_Mat:()J未找到 OpenCV 3.0.0 Android 本机方法:org.opencv.core.Mat.n_Mat:()J
【发布时间】:2016-01-11 09:07:23
【问题描述】:

我正在通过 Android Java 绑定库 为 Xamarin.Android 使用本机 android Opencv 3.0.0 库
我正在做类似的事情 Tutorial 问题是我遇到了这个异常

未找到本机方法:org.opencv.core.Mat.n_Mat:()J

我能做些什么来解决这个问题?任何帮助将不胜感激,谢谢!

我的Main Activity源代码:

 public class MainActivity : Activity
    {

        Mat m;
        Mat grayM;
        ImageView imageView;
        public MainActivity()
        {
            if (!OpenCVLoader.InitDebug())
            {
                System.Console.WriteLine("GG");
            }

        }

        protected override void OnCreate(Bundle bundle) 
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main); 

            Button button = FindViewById<Button>(Resource.Id.myButton);
            ImageButton crop = FindViewById<ImageButton>(Resource.Id.crop);
            crop.Visibility = ViewStates.Invisible;
            imageView = FindViewById<ImageView>(Resource.Id.IMG);

            if (IsThereAnAppToTakePictures ())
            {
                CreateDirectoryForPictures ();

                button.Click += delegate 
                    {
                        Intent intent = new Intent (MediaStore.ActionImageCapture);
                        App._file = new File (App._dir, String.Format("myPhoto_{0}.jpg", System.Guid.NewGuid()));
                        intent.PutExtra (MediaStore.ExtraOutput, Android.Net.Uri.FromFile (App._file));
                        StartActivityForResult (intent, 0);

                        crop.Visibility = ViewStates.Visible;
                        // SetImg();
                    };
            }

            crop.Click += (sender, e) => 
                {
                    SetImg();
                };
        }

        void SetImg()
        {

            using (Bitmap _img = BitmapFactory.DecodeFile(App._file.Path))
            {
                if (_img != null)
                {
                    m = new Mat();
                    grayM = new Mat();
                    Utils.BitmapToMat(_img, m);
                    Imgproc.CvtColor(m, grayM, Imgproc.ColorBgr2gray);
                    Imgproc.CvtColor(grayM, m, Imgproc.ColorGray2bgra);
                    using (Bitmap bit = Bitmap.CreateBitmap(m.Cols(), m.Rows(), Bitmap.Config.Argb8888))
                    {
                        Utils.BitmapToMat(bit,m);
                        imageView.SetImageBitmap(bit);

                    }

                    m.Release();
                    grayM.Release();
                }
            }
        }

        protected override void OnActivityResult (int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult (requestCode, resultCode, data);

            // Make it available in the gallery

            Intent mediaScanIntent = new Intent (Intent.ActionMediaScannerScanFile);
            Android.Net.Uri contentUri = Android.Net.Uri.FromFile (App._file);
            mediaScanIntent.SetData (contentUri);
            SendBroadcast (mediaScanIntent);
             imageView.SetImageBitmap(BitmapFactory.DecodeFile(contentUri.Path));

            // Dispose of the Java side bitmap.
            GC.Collect();
        }

        private void CreateDirectoryForPictures ()
        {
            App._dir = new File (
                Android.OS.Environment.GetExternalStoragePublicDirectory (
                    Android.OS.Environment.DirectoryPictures), "CameraAppDemo");
            if (!App._dir.Exists ())
            {
                App._dir.Mkdirs( );
            }
        }

        private bool IsThereAnAppToTakePictures ()
        {
            Intent intent = new Intent (MediaStore.ActionImageCapture);
            IList<ResolveInfo> availableActivities =
                PackageManager.QueryIntentActivities (intent, PackageInfoFlags.MatchDefaultOnly);
            return availableActivities != null && availableActivities.Count > 0;
        }


    }
    public static class App 
    {
        public static File _file;
        public static File _dir;
        public static Bitmap bitmap;
    }
}

以及日志的异常:

[MonoDroid] 未处理的异常:[MonoDroid] Java.Lang.UnsatisfiedLinkError:类型异常 'Java.Lang.UnsatisfiedLinkError' 被抛出。 [MonoDroid] 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] 在 /Users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 [MonoDroid] 在 Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (intptr,intptr,intptr,Android.Runtime.JValue*) [0x00084] 在 /Users/builder/data/lanes/2058/58099c53/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:1029 [MonoDroid] 在 Android.Runtime.JNIEnv.FinishCreateInstance (intptr,intptr,intptr,Android.Runtime.JValue*) [0x0000b] 在 /Users/builder/data/lanes/2058/58099c53/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:306 [MonoDroid] 在 Android.Runtime.JNIEnv.FinishCreateInstance (intptr,intptr,intptr,Android.Runtime.JValue[]) [0x0001d] 在 /Users/builder/data/lanes/2058/58099c53/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:312 [MonoDroid] 在 Org.Opencv.Core.Mat..ctor () [0x000da] 中

【问题讨论】:

    标签: c# android opencv xamarin xamarin.android


    【解决方案1】:

    我尝试用 ILoaderCallbackInterface(实现)做一些技巧:

      public class LoaderCallBackHelper: Java.Lang.Object,ILoaderCallbackInterface
        {
            public void OnManagerConnected(int p0)
            {
                switch (p0)
                {
                    case LoaderCallbackInterface.Success: 
                        System.Console.WriteLine("Succes");
                        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");
                    }
            }  
    

    没有运气。
    然后我尝试做其他trick

      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 再次不会初始化!
    所以我的解决方案是我下载了 OpenCV 版本 2.4.11 并重新安装到我的项目中。现在一切正常:

    public  MainActivity()
            {
                if (!OpenCVLoader.InitDebug())
                {
                    System.Console.WriteLine("Failed to INIT \n OpenCV Failure");
                }
                else
                {
                    System.Console.WriteLine("OpenCV INIT Succes");
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多