Xamarin.android 如何访问android项目中的.dll或.so文件Xamarin

Xamarin.android 如何访问android项目中的.dll或.so文件Xamarin,xamarin.android,pinvoke,dllimport,.so,Xamarin.android,Pinvoke,Dllimport,.so,我有一个文件夹,里面有很多.so文件,我在代码运行时试图使用这些文件。 我将它们放在一个名为“External”的文件夹中,然后尝试如下方式访问它们: [DllImport("External\\libvocon_ext_heap.so", EntryPoint = "ph_CreateWin32PrivateHeap", CallingConvention = CallingConvention.Cdecl)] public static extern PH_ERROR ph_CreateW

我有一个文件夹,里面有很多.so文件,我在代码运行时试图使用这些文件。

我将它们放在一个名为“External”的文件夹中,然后尝试如下方式访问它们:

[DllImport("External\\libvocon_ext_heap.so", EntryPoint = "ph_CreateWin32PrivateHeap", CallingConvention = CallingConvention.Cdecl)]
public static extern PH_ERROR ph_CreateWin32PrivateHeap(ref LH_HEAP_INTERFACE pHeapInterface, out IntPtr ppHeapInst);
[DllImport("libvocon_ext_heap.so", EntryPoint = "ph_CreateWin32PrivateHeap", CallingConvention = CallingConvention.Cdecl)]

我还尝试将文件放在Assets文件夹中,但仍然得到相同的System.DllNotFoundException

您是否已将so文件的生成操作设置为AndroidNativeLibrary


参见

这是一个迟来的答案,但我确实找到了解决问题的办法。主要问题是我如何在项目中存储库文件。为了定位库文件,它们必须存储在特定目录下。它们必须存储在名为“libs”的目录和特定子目录中,而不是像我那样存储在“External”目录中,如下所示:

  • libs>armeabi>libfoo.so
  • libs>armeabi-v7a>libfoo.so
  • libs>x86>libfoo.so
由于Android CPU可以基于3种不同的ARM体系结构,因此每种体系结构都必须有一个目录(armeabi、armeabi-v7a、x86)。我导入的库文件如下所示:

[DllImport("External\\libvocon_ext_heap.so", EntryPoint = "ph_CreateWin32PrivateHeap", CallingConvention = CallingConvention.Cdecl)]
public static extern PH_ERROR ph_CreateWin32PrivateHeap(ref LH_HEAP_INTERFACE pHeapInterface, out IntPtr ppHeapInst);
[DllImport("libvocon_ext_heap.so", EntryPoint = "ph_CreateWin32PrivateHeap", CallingConvention = CallingConvention.Cdecl)]
您只需要写入库文件的名称,因为它将自己找到正确的目录路径。您还可以编写类似“vocon_ext_heap”的名称,因为如果缺少“lib”和“.so”,它可以自动将其添加到文件名中


我还重新安装了Xamarin SDK管理器,因为我找到了一个可能的解决方案,要求重新安装它,但我不知道它是否修复了与此问题相关的任何问题。此外,这些库当然必须按照Softlion提到的AndroidNativeLibrary进行构建。

不幸的是,这没有帮助,仍然得到了System.DllNotFoundException。但是根据文档,这是问题解决方案的一部分,所以我现在应该比以前更接近了,谢谢。