在 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 中的一个设置。
我的 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 中的一个设置。