在 C++ 中有条件地调用 JNI

Conditionally call JNI in C++

我的 C++ 代码需要在两种不同的环境中 运行 - 一种安装了 Java,一种没有安装。在Java环境下,需要进行JNI调用。

我目前的设置如下:

Main.cpp:

#include "JNIInterface.h"
if(useJNI){
    JNIInterface::DoJNIStuff();
} else {
    DoNormalStuff();
}

JNIInterface.h:

#include <mutex>
//has no <jni.h> include
...

JNIInterface.cpp:

#include "JNIInterface.h"
#include <jni.h>
void JNIInterface::DoJNIStuff()
{   std::call_once(jvmFlag, [](){
        //basically all the JVM initialization stuff    
    });
    DoStuff(jvm);
}

正如预期的那样,在非 Java 环境中它会导致 "The program can't start because JVM.dll is missing from your computer"。

似乎唯一的办法就是避免在编译时在预处理器中包含 JNI 代码。是否有不同的设置来避免此问题?

既然你提到了"DLL",我就假设Windows。简单的解决方案是所谓的延迟加载。这可以防止 DLL 在启动时加载,但仅在首次调用时加载。没有调用,没有加载,即使缺少 DLL 也没有问题。只是 MSVC 中的一个设置。