2015-04-22 54 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