我有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/