【发布时间】:2018-12-22 16:34:46
【问题描述】:
我可以加载像 JavaSystem.LoadLibrary("my_library") 这样的原生库,然后调用它的函数。
使用后如何“卸载”或“处置”加载的库?我真的应该这样做吗?加载的库是否存在“生命周期”?
【问题讨论】:
我可以加载像 JavaSystem.LoadLibrary("my_library") 这样的原生库,然后调用它的函数。
使用后如何“卸载”或“处置”加载的库?我真的应该这样做吗?加载的库是否存在“生命周期”?
【问题讨论】:
是否存在加载库的“生命周期”?
是的,在 Java 中,它基于执行 LoadLibrary 的“类加载器”。
因此,假设您在名为 X 的类中加载共享库,当加载该库的 X 实例被垃圾回收时,共享库也会从内存中删除/清除,因为没有任何引用它。
注意:请记住,如果您在 Xamarin/Mono 托管的 Java 运行时中加载它,因此您可能有 .Net/Java 对等对象,并且对于 Java 到 GC 加载器类,其 .Net 对等对象需要释放(处置)。
我真的应该这样做吗?
假设您的代码没有泄漏任何对等对象,Java 运行时将在可能时清除分配给您的共享库的内存。
注意:如果您的共享库函数的使用受到限制,我建议您将 LoadLibrary 与它自己的 C#/Java.Lang.Object 类隔离,并且不要在 App 的 Application 子类或 Activity 的子类中使用它子类,以便您可以直接控制其生命周期。
在性能方面,请记住加载该共享库是有代价的,因此如果您的应用程序使用模式要求,您可能希望保留对该类加载器的引用,而不是让它一直被 GC,即访问速度与内存消耗,但只有您可以根据应用分析做出决定。
【讨论】: