我在这里有一个有趣的JNA问题。
在JRE1.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应用程序,这不是什么大事),但我仍然想知道这是否是一个bug。
编辑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'
工作得很好,糟糕,我想可能是其他东西在我的生产代码中引用了它,它并没有真正地发布它,总是检查弱引用!
发布于 2011-10-20 13:21:05
这似乎是个bug,除了重新启动服务之外,我还没有找到其他解决方案。无论如何,最好还是重新启动库更新。
https://stackoverflow.com/questions/6901714
复制相似问题