如何在Android项目Xamarin中访问.dll或.so文件

时间:2017-11-06 15:35:12

标签: xamarin.android pinvoke dllimport .so

我有一个包含很多.so文件的文件夹,我正在尝试使用我的代码运行时。 enter image description here

我将它们放在一个名为“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);

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

2 个答案:

答案 0 :(得分:1)

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

  • 库> armeabi> libfoo.so
  • 库> armeabi-V7A> libfoo.so
  • 库> 86> libfoo.so

由于Android CPU可以基于3种不同的ARM体系结构,因此每种体系结构都必须有一个目录(armeabi,armeabi-v7a,x86)。我导入了这样的库文件:

[DllImport("libvocon_ext_heap.so", EntryPoint = "ph_CreateWin32PrivateHeap", CallingConvention = CallingConvention.Cdecl)]

您只需要编写库文件的名称,因为它将自己找到正确的目录路径。您还可以将名称写为“vocon_ext_heap”,因为如果文件名丢失,它可以自动将“lib”和“.so”添加到文件名中。

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

答案 1 :(得分:0)

您是否已将so文件的构建操作设置为AndroidNativeLibrary?

请参阅https://developer.xamarin.com/guides/android/advanced_topics/using_native_libraries/