有条件地用C ++调用JNI

时间:2015-04-22 22:03:18

标签: java c++ java-native-interface c-preprocessor

我的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代码。是否有不同的设置可以避免此问题?

1 个答案:

答案 0 :(得分:2)

既然你提到“DLL”我会假设Windows。简单的解决方案就是延迟加载。这可以防止DLL在启动时加载,但仅在首次调用时加载。如果DLL丢失,没有呼叫,没有负载,没有问题。只是在MSVC中设置。