当前位置: 首页 > 知识库问答 >
问题:

未找到OpenCV 3.0.0 Android本地方法:org.OpenCV.core.mat.n_mat:()J

宁兴修
2023-03-14
 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.UnsatifiedLinkError:引发了类型为“java.lang.UnsatifiedLinkError”的异常。[MonoDroid]在system.runtime.exceptionservices.exceptiondispatchinfo.throw()[0x0000b]在/users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/system.runtime.2058/58099c53/source/mono/mcs/class/corlib/system.runtime.exceptionservices/exceptiondispatchinfo.cs:61[MonoDroid]在.g.cs:1029[MonoDroid]在Android.runtime.jnienv.finishCreateInstance(intptr,intptr,intptr,android.runtime.jvalue*)[0x0000b]在/users/builder/data/lanes/2058/58099c53/sourc/MonoDroid/src/mono.android/rnienv.finishCreateInstance(intptr,intptr,intptr,android.jvalue*)[0x0000b]在C53/source/MonoDroid/src/mono.android/src/runtime/jnienv.cs:312[MonoDroid]at org.opencv.core.mat.ctor()[0x000da]in

共有1个答案

徐杰
2023-03-14

我尝试用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");
                }
        }  

但运气不好。
然后我试着做了其他的把戏:

  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");
                    }
            }   
public  MainActivity()
        {
            if (!OpenCVLoader.InitDebug())
            {
                System.Console.WriteLine("Failed to INIT \n OpenCV Failure");
            }
            else
            {
                System.Console.WriteLine("OpenCV INIT Succes");
            }
        }
 类似资料:
  • 我已经翻阅了这里所有关于这个主题的其他帖子,但没有一个对我有帮助。 我使用的是一个第三方SDK(oovoo),它包含一个.jar文件和.so文件(armeabi-v7a) null 谢谢! android studio版本0.8.6 gradle版本1.12 Ooovoo版本1.2.4

  • 问题内容: 我有一个带有本机函数的小型JNI文件,该函数将char数组转换为字节数组(因此我可以将其发送到我的C ++客户端)。 定义如下: 软件包名称(加载库的位置是: 并且该类中的本机deffiniton如下: 但是当调用ConvertString函数时,我得到以下错误: 问题可能是该类(communicationmoduleTCPIP)是可运行的类吗?我不在类中运行,并且具有以下定义(当我注

  • 我犯了这个gradle错误。 错误:(9,0)找不到Gradle DSL方法:“compile()” 我试着引用类似的问题,但没有成功。 Android gradle构建错误:(9,0)未找到Gradle DSL方法:“compile()”。 同步生成时出现错误“找不到Gradle DSL方法:'compile()'”。格拉德尔 找到不支持的Gradle DSL方法:“compile()”! 我的

  • 在Android Studio的最新更新后,使用classpath 'com.android.tools.build:gradle:2.3.0-beta1',我在gradle同步时收到以下错误。 错误:找不到 Gradle DSL 方法: 'has()' 有什么想法吗 更新其由Android凌空抽射,完整错误: 错误:失败:生成失败,出现异常。 > 其中:脚本'D:\APPS-MOBI**\And

  • maven偶尔会抱怨,在构建另一个将特定依赖项作为依赖项的项目时,无法在本地存储库中找到在本地构建和打包的特定依赖项。我们得到如下错误: 未能在项目X上执行目标:无法解析项目X的依赖关系:未能在[存档存储库]中找到Y,已缓存在本地存储库中,在内部的更新间隔过去或强制更新之前,不会重新尝试解析-> 唯一可行的两件事是等待很长时间直到maven变得聪明起来,或者完全删除本地存储库。假定等待选项与前述更

  • 问题内容: 有一块代码可以在android 4.1.2上正常工作,但在4.0.3上却不能正常工作,崩溃日志为4.0.3 我收到UnsatisfiedLinkError异常 请指导我谢谢 这是我的课 这是我从中编译并创建二进制“ libsqliteX.so”文件的源cpp文件http://www.sqlite.org/android/tree?ci=trunk&re=jni|src/org/sqli