如何在 Xamarin.Android 中 "unload" 本机库?

How to "unload" native library in Xamarin.Android?

我可以像 JavaSystem.LoadLibrary("my_library") 一样加载本机库,然后调用它的函数。 使用后如何"unload"或"dispose"加载库?我真的应该这样做吗?有没有"lifecycle"的加载库?

Is there a "lifecycle" of loaded library?

是的,在Java中它是基于执行LoadLibrary的"classloader"。

因此假设您在名为 X 的 class 中加载共享库,当加载库的 X 实例被垃圾回收时,共享库也被回收dropped/cleared 来自记忆,因为没有任何引用它。

注意:请记住,如果您在 Xamarin/Mono 托管的 Java 运行时中加载它,那么您可能有 .Net/Java 对等对象 并且 Java 到 GC 加载器 class,它的 .Net 对等对象需要被释放(处置)。

And should I really have to do this?

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

注意:如果您的共享库函数的使用受到限制,我建议您将您的 LoadLibrary 与它自己的 C#/Java.Lang.Object class 隔离并且不要在内部使用它App 的 Application subclass,或者 Activity 的 subclass,这样你就可以直接控制它的生命周期。

就性能而言,请记住加载该共享库会受到惩罚,因此如果您的应用程序使用模式有要求,您可能希望保留对该 classloader 的引用而不是允许它GC 始终存在,即访问速度与内存消耗,但只有您可以根据对应用程序的分析来做出决定。