我遇到了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文件可用。
谢谢!
答案 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退出。 强>