如何在Xamarin.Android中“卸载”本机库?

时间:2018-12-22 16:34:47

标签: c# android xamarin mono

我可以加载JavaSystem.LoadLibrary("my_library")之类的本机库,然后调用它的函数。 使用后如何“卸载”或“处置”已加载的库?我真的应该这样做吗?是否存在加载库的“生命周期”?

1 个答案:

答案 0 :(得分:0)

  

是否存在已加载库的“生命周期”?

是的,在Java中,它基于执行LoadLibrary的“类加载器”。

因此,假设您正在名为X的类中加载共享库,则当垃圾收集了加载库的X实例时,共享库也会从内存中删除/清除。没有任何引用。

注意:请记住,如果要在Xamarin / Mono托管的Java运行时中加载此文件,因此您可能具有 .Net / Java对等对象,并且对于Java到GC的那个加载程序类,其.Net对等对象需要释放(处置)。

  

我真的应该这样做吗?

假设您的代码没有泄漏任何一个对等对象,则Java运行时将在能够的情况下清除分配给共享库的内存。

注意:如果共享库功能的使用受到限制,我建议您将LoadLibrary与它自己的C#/ Java.Lang.Object类隔离开来,不要在App的Application子类中使用它,或者活动的子类,因此您可以直接控制其生命周期。

在性能方面,请记住,加载该共享库会受到惩罚,因此,如果您的应用使用情况有所不同,您可能希望保留对该类加载器的引用,而不是始终将其加载到GC中,即访问速度与内存消耗,但只有您可以基于对应用程序进行概要分析才能确定。