如何在 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 始终存在,即访问速度与内存消耗,但只有您可以根据对应用程序的分析来做出决定。
我可以像 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 始终存在,即访问速度与内存消耗,但只有您可以根据对应用程序的分析来做出决定。