我有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环境中,它导致“由于您的计算机缺少JVM.dll,导致程序无法启动”。

似乎唯一的方法是避免在编译时在预处理器中包含JNI代码。是否有其他设置可以避免此问题?

最佳答案

由于您提到“DLL”,因此我假设使用Windows。简单的解决方案是称为延迟加载。这样可以防止在启动时(但仅在首次调用时)加载DLL。没有调用,没有负载,如果缺少DLL,就没有问题。只是MSVC中的设置。

关于java - 在C++中有条件地调用JNI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29809735/

10-11 00:36