【发布时间】:2011-10-17 14:52:29
【问题描述】:
我在这里遇到了一个有趣的 JNA 问题。
在 JRE 1.6 和 1.7 x64 下,我可以像这样加载和卸载库:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.Initialize();
this.Lib = null;
Runtime.getRuntime().gc();
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.Initialize();
这将加载它,运行初始化例程,将类设置为 null 并强制 GC 清理它,这将卸载库(我的误解,如果我做错了,请纠正我!),和重新加载并重新初始化它。在 x64 上运行 完美。
但是在 x86 上,此代码将无法加载第二个 Initialize()(在此示例中,它实际上只是在 C 库上返回),它只会挂在那里什么都不做,我可以用这些库做所有其他事情,除了重新加载它们。
我是否遗漏了什么,或者我是否偶然发现了需要向 JNA 开发团队报告的内容?
编辑:
我确实有办法处理这个问题(基本上是在库交换时重新启动 java 应用程序,这没什么大不了的),但我仍然想知道这是否是一个错误。
编辑 2:
写了一个测试用例以防我不得不提交这个:
public class EntryPoint {
public static void main(String[] args) {
String path = new File("").getAbsolutePath();
System.out.println("Path: " + path);
ITest it = (ITest)Native.loadLibrary(path + "\\jnaFailureC_x86.dll", ITest.class);
System.out.println("Expecting 'Test', result: '" + it.myMethod().getString(0) + "'");
WeakReference<ITest> itRef = new WeakReference<ITest>(it);
it = null;
Runtime.getRuntime().gc();
if(itRef.get() != null){
System.out.println("Not collected.");
}else{
System.out.println("Collected");
}
it = (ITest)Native.loadLibrary(path + "\\jnaFailureC_x86.dll", ITest.class);
System.out.println("Expecting 'Test', result: '" + it.myMethod().getString(0) + "'");
}
}
Path: G:\Source\jnaFailure
Expecting 'Test', result: 'Test'
Collected
Expecting 'Test', result: 'Test'
工作正常,bleh,我假设可能有其他东西在我的生产代码中引用它并且它实际上并没有发布它,请始终检查弱引用!
【问题讨论】:
标签: java 32bit-64bit jna