从JNI卸载JAR文件

时间:2014-07-14 11:54:54

标签: java delphi java-native-interface delphi-xe2

我遇到了Java Native Interface的问题。

我在我的应用程序中使用JNI,一切正常,除了我无法从JARI访问的.JAR文件中卸载/释放锁。

这是我正在使用的析构函数:

destructor Schnittstelle.Destroy;
begin
try
if (assigned(FJNIEnv)) then
begin
  ShowMessage('Destruktor');

  FJNIEnv.Free;
  FJNIEnv := nil;

  FJavaVM.JavaVM^.DetachCurrentThread(FJavaVM.JavaVM);
  FJavaVM.JavaVM^.DestroyJavaVM(FJavaVM.JavaVM);

  FJavaVM.Free;
  FJavaVM := nil;

  inherited Destroy;
end;
except
  ShowMessage('Java VM kann nicht freigegeben werden.');
  Exit;
end;
end;

在调用析构函数之后,我尝试更改JAR文件名以测试JNI是否停止访问该文件,但事实并非如此。

如果我终止我的delphi应用程序,则JAR文件可用。

谢谢!

1 个答案:

答案 0 :(得分:0)

您没有在您的问题中指定如何通过JNI直接通过某些Java调用来直接通过JNI加载JAR文件中的类。

无论如何,我假设JVM中的类加载({3}}或Class.forName(String)使用与JNI ClassLoader.loadClass(String)相同的机制:

  

findClass的

     

在JDK 1.1版中,此函数加载本地定义的类。它会搜索CLASSPATH环境变量指定的目录和zip文件,以查找具有指定名称的类。

     

自Java 2 SDK 1.2版以来,Java安全模型允许非系统类加载和调用本机方法。 FindClass定位与当前本机方法关联的类加载器;也就是说,声明本机方法的类的类加载器。如果本机方法属于系统类,则不涉及类加载器。否则,将调用适当的类加载器来加载和链接命名类。

     

从Java 2 SDK 1.2版开始,通过调用接口调用FindClass 时,没有当前的本机方法或其关联的类加载器。在这种情况下,使用 FindClass的结果。这是虚拟机为应用程序创建的类加载器,并且能够找到java.class.path属性中列出的类。

另请参阅ClassLoader.getSystemClassLoader上的其他注意事项:

  

在程序退出之前似乎没有完全卸载JVM。

我想引用jar文件及其中的类的系统类加载器在卸载JVM之前不会关闭, 所以我想在程序之前无法卸载jar退出。