Java.Lang.UnsatisfiedLinkError:'

问题描述

我试图通过Java绑定模板在Xamarin.Android上使用OpenCv 4。这些是我已经完成的步骤: 0)我已经通过cmake和mingw64编译了opencv二进制文件以获得.jar和.a

  1. 我将.jar和静态库(.a)放在Xamarin Java绑定模板的Jars forlder中,并且我已经编译了模板。 1.a).jar Build Action是EmbeddedJar 1.b)libs Build Action是EmbeddednativeLibrary
  2. 我在Xamarin.Android项目中添加了对该模板的引用:opencv方法被正确识别!

但是,当我尝试执行时:

Mat Source = Imgcodecs.Imread(ImagePath,Imgcodecs.ImreadGrayscale);

我得到一个错误

java.lang.UnsatisfiedLinkError: 'No implementation found for long org.opencv.imgcodecs.Imgcodecs.imread_0(java.lang.String,int) (tried Java_org_opencv_imgcodecs_Imgcodecs_imread_10 and Java_org_opencv_imgcodecs_Imgcodecs_imread_10__Ljava_lang_String_2I)'

我认为方法名称可能不匹配,可能是由于Java解析错误所致。

我还尝试通过JavaSystem.LoadLibrary(“ LibraryNameWithoutinitialLib”)加载共享库来使用共享库(.so),但我有相同的错误:/

你知道为什么吗?

enter image description here

enter image description here

解决方法

您不能将静态库与Xamarin.Android链接,因为基于Xamarin / Mono NDK的运行时是静态的主条目可执行文件,并且不会按项目动态生成。如果不需要使用.jar / .aar高级包装器,则将需要使用运行时共享库​​,并为需要调用的导出函数定义DllImportAttribute条目。

Xamarin.Android通过标准的PInvoke机制支持使用本机库。

Using Native Libraries

Use C/C++ libraries with Xamarin

注意:开放源代码中有许多OpenCV C#包装器/ DllImport文件(即github搜索github)

注意:如果您使用的是第三方.jar / .aar,请确保它们使用的是OpenCV共享库,因此不需要gradle脚本将它们链接到基于NDK的Android应用中。