C# 找不到OpenCV 3.0.0 Android本机方法:org.OpenCV.core.Mat.n_Mat:()J
我正在使用Xamarin.android的原生android Opencv 3.0.0库,通过android Java绑定库C# 找不到OpenCV 3.0.0 Android本机方法:org.OpenCV.core.Mat.n_Mat:()J,c#,android,opencv,xamarin,xamarin.android,C#,Android,Opencv,Xamarin,Xamarin.android,我正在使用Xamarin.android的原生android Opencv 3.0.0库,通过android Java绑定库 我也做了类似的,问题是我得到了这个例外 未找到本机方法:org.opencv.core.Mat.n_Mat:()J 我能做些什么来解决这个问题?任何帮助都将不胜感激,谢谢 我的主要活动的源代码: public class MainActivity : Activity { Mat m; Mat grayM; Im
我也做了类似的,问题是我得到了这个例外 未找到本机方法:org.opencv.core.Mat.n_Mat:()J 我能做些什么来解决这个问题?任何帮助都将不胜感激,谢谢 我的主要活动的源代码:
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;
}
}
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");
}
}
公共类main活动:活动
{
matm;
matgraym;
图像视图图像视图;
公共活动()
{
如果(!OpenCVLoader.InitDebug())
{
系统控制台写入线(“GG”);
}
}
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
Button Button=FindViewById(Resource.Id.myButton);
ImageButton裁剪=FindViewById(Resource.Id.crop);
crop.Visibility=ViewStates.Invisible;
imageView=findviewbyd(Resource.Id.IMG);
如果(是否在此处拍摄照片())
{
CreateDirectoryForPictures();
按钮。单击+=委派
{
意向意向=新意向(MediaStore.ActionImageCapture);
App._file=新文件(App._dir,String.Format(“myPhoto_{0}.jpg”,System.Guid.NewGuid());
intent.PutExtra(MediaStore.ExtraOutput,Android.Net.Uri.FromFile(App._文件));
StartActivityForResult(意向,0);
crop.Visibility=ViewStates.Visible;
//SetImg();
};
}
裁剪。单击+=(发件人,e)=>
{
SetImg();
};
}
void SetImg()
{
使用(位图_img=BitmapFactory.DecodeFile(App._file.Path))
{
如果(_img!=null)
{
m=新垫();
grayM=新材料();
Utils.BitmapToMat(_img,m);
Imgproc.cvt颜色(m,灰色,Imgproc.colorbgr2灰色);
Imgproc.CvtColor(灰色,m,Imgproc.ColorGray2bgra);
使用(位图位=Bitmap.CreateBitmap(m.Cols(),m.Rows(),Bitmap.Config.argb888))
{
Utils.BitmapToMat(位,m);
设置图像位图(位);
}
m、 释放();
grayM.Release();
}
}
}
受保护的覆盖void OnActivityResult(int请求代码、结果代码、意图数据)
{
base.OnActivityResult(请求代码、结果代码、数据);
//让它在图库中可用
Intent mediaScanIntent=新的Intent(Intent.ActionMediaScannerScanFile);
Android.Net.Uri contentUri=Android.Net.Uri.FromFile(App.\u文件);
mediaScanIntent.SetData(contentUri);
SendBroadcast(mediaScanIntent);
SetImageBitmap(BitmapFactory.DecodeFile(contentUri.Path));
//处理Java端位图。
GC.Collect();
}
私有void CreateDirectoryForPictures()
{
App.\u dir=新文件(
Android.OS.Environment.GetExternalStoragePublicDirectory(
Android.OS.Environment.DirectoryPictures),“CameraAppDemo”);
如果(!App.\u dir.Exists())
{
App._dir.Mkdirs();
}
}
私人书房在这里拍照()
{
意向意向=新意向(MediaStore.ActionImageCapture);
IList可用性=
PackageManager.QueryInputActivities(intent,PackageInfoFlags.MatchDefaultOnly);
return availableActivities!=null&&availableActivities.Count>0;
}
}
公共静态类应用程序
{
公共静态文件\u文件;
公共静态文件_dir;
公共静态位图;
}
}
以及异常的日志:
[MonoDroid]未处理的异常:[MonoDroid]
Java.Lang.UnsatifiedLinkError:类型异常
抛出了“Java.Lang.UnsatifiedLinkError”。[单机器人]在
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]in
/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]in
/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]中
我尝试使用ILoaderCallbackInterface(实现)执行一些技巧: 然后像这样(在MainActivity上): 而且没有运气。
然后我试着做另一个把戏:
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;
}
}
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");
}
}