2015-04-22 53 views
1

我有C++代码需要在两个不同的环境中运行 - 一个安装了Java,一个没有。在Java环境中,它将需要进行JNI调用。有条件地在C++中调用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 env否则会导致“程序无法启动,因为您的计算机中缺少JVM.dll”。

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

+0

这两个变种真的有必要在一个程序中? (当然可能,但是...)。两个程序(来自具有不同预处理器的相同代码)可选地带有一些起始代码来检查Java是否存在并选择正确的变体,这更容易。 – deviantfan

+0

是的,这是我必须处理的限制。我想即使在我不需要调用Java的情况下,我也会添加jvm.dll。 – zz3599

回答

2

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

+0

即使最终我没有使用这个,如果我们有一个正常的构建系统,这将是正确的路要走。谢谢! – zz3599

+0

您也可以从命令行执行此操作,但并不涉及太多魔法。 – MSalters