ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
你不能同时链接来自不同厂商的多个具有Java虚拟机实现的库。因为JNI没有指定Java虚拟机实现库的名字,你需要自己处理不同名字的Java虚拟机实现库。例如,在Win32上,JDK1.1版本的Java虚拟机库是javai.dll而JDK2中则叫做jvm.dll. 解决方案是应用程序运行时动态加载特点的某个虚拟机库。这样的话,虚拟机库的名字就可以通过应用程序被简单的配置,例如,以下的Win32代码用于给定虚拟机库的路径查找JNI_CreateJavaVm函数的入口。 ~~~ /* Win32 version */ void *JNU_FindCreateJavaVM(char* vmlibpath){ HINSTANCE hVM = LoadLibrary(vmlibpath); if(!hVM){ return; } return GetProcessAddress(hVM, "JNI_CreateJavaVM"); } ~~~ LoadLibrary和GetProcessAddress是Win32上的用于动态链接的API函数。加载动态库的函数通常可以传递库名字或者库的完成路径,如果传递的参数不是完成路径,则需要做一些配置(比如将库所在目录加入环境变量PATH) Solaris版本的代码也很类似。 /* Solaris version */ void *JNU_FindCreateJavaVM(char* vmlibpath){ void *libVM = dlopen(vmlibpath, RTLD_LAZY); if(!libVM){return;} return dlsym(libVM, "JNI_CreateJavaVM"); }