在 nuget 中包含 Android 本机二进制文件(.so 文件)以便在 Xamarin 中使用的正确方法是什么?



我们构建包含特定于应用程序的本机二进制文件的 nuget。 不过,我们几乎只是使用 nuget 作为文件传输机制;我们调整 Xamarin 项目以指向 packages/目录中提取的 libWhatever.so 文件,并将它们标记为 EmbeddedNativeLibraries。

这有效,但感觉更像是黑客而不是实际解决方案。

那么正确的方法是什么呢? 我找到的所有现有的nuget文档都假设本机二进制文件是Windows dlls - 当然在Android上下文中没有用。

当然,我们需要能够在nugets中包含多种架构; armeabi,armeabi-v7a,x86等。 也不能像powershell那样包含Windows的讨厌,因为我们主要在Mac上工作(我在其他地方看到的一些线程认为使用嵌入nuget中的powershell脚本修复问题可能是要走的路)。

更新:在 https://forums.xamarin.com/discussion/35517/is-it-possible-to-include-native-libraries-automatically-from-a-nuget-package 有一个相关的讨论

使用 Nugetbuild目录中的自定义.targets执行此操作,该目录将共享库作为AndroidNativeLibrary项添加到 Android 项目中。将 Nuget 添加到项目时,目标将添加到.csproj并且您都已设置...

例:

若要将libDNAGenetics.so作为AndroidNativeLibrary生成项包含在Xamarin.Android项目中,请创建一个包含以下内容的.targets

<PropertyGroup>
<_DNAGeneticNugetNativePath Condition="'$(_DNAGeneticNugetNativePath)' == ''">$(MSBuildThisFileDirectory)..native</_DNAGeneticNugetNativePath>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFrameworkIdentifier)' == 'MonoAndroid'">
<AndroidNativeLibrary Include="$(_DNAGeneticNugetNativePath)androidarmeabi-v7alibDNAGenetics.so">
<Link>$(_DNAGeneticNugetNativePath)androidarmeabi-v7alibDNAGenetics.so</Link>
</AndroidNativeLibrary>
<AndroidNativeLibrary Include="$(_DNAGeneticNugetNativePath)androidx86libDNAGenetics.so">
<Link>$(_DNAGeneticNugetNativePath)androidx86libDNAGenetics.so</Link>
</AndroidNativeLibrary>
<AndroidNativeLibrary Include="$(_DNAGeneticNugetNativePath)androidarm64-v8alibDNAGenetics.so">
<Link>$(_DNAGeneticNugetNativePath)androidarm64-v8alibDNAGenetics.so</Link>
</AndroidNativeLibrary>
<AndroidNativeLibrary Include="$(_DNAGeneticNugetNativePath)androidx86_64libDNAGenetics.so">
<Link>$(_DNAGeneticNugetNativePath)androidx86_64libDNAGenetics.so</Link>
</AndroidNativeLibrary>
</ItemGroup>

相关内容

最新更新