在我看到的所有示例中,它们通过从不直接调用该函数来避免问题,因此它永远不必链接,因此没有错误。诀窍是在运行时查找函数并通过函数指针调用。这是在 Windows 上执行此操作的方法。不知道在其他操作系统上执行此操作的语法。
[免责声明 - 我从几个函数中复制/粘贴了代码,并且可能引入了编译器错误。这可能会或可能不会编译,但它应该让你开始]
首先为指向函数的指针创建自己的 typedef
typedef jint (JNICALL* JvmCreateProcTypeDef)(JavaVM **, void **, void);
使用LoadLibrary查找 JVM dll 。由您的应用程序决定在哪里可以找到 JVM DLL。在我们的例子中,我们分发了第 3 方 JRE,并且知道在哪里可以找到 DLL。
HMODULE jvmDll = LoadLibrary(jvmDllPath);
接下来使用GetProcAddress从 JVM dll 中查找函数的地址
JvmCreateProcTypeDef jvmCreateProc = (JvmCreateProcTypeDef) GetProcAddress(jvmDll,"JNI_CreateJavaVM");
现在将直接调用该函数的代码替换为以下通过函数指针调用它的代码:
jvmCreateProc(&internal::gJVM, (void**)&internal::gEnv, &vm_args);
这应该可以让您通过所有编译链接错误。现在您所要做的就是在您的代码找不到 DLL 时处理运行时错误 :)
希望这可以帮助!