2012-02-13 32 views
3

我使用JNI從C中啓動Java應用程序。儘管只要我使用控制檯應用程序,就可以快速完成此任務,但對於Swing-GUI,事情會變得棘手。我可以從Java調用C-Executable的函數嗎?

爲了讓應用程序「活着」,我使用了一個while循環,只要GUI沒有關閉就運行。當這個循環運行時,它總是請求,如果應用程序仍然通過請求布爾值運行。

while(javaRunning){ 
    if(JNI_FALSE == env->CallBooleanMethod(obj, boolMethod)) 
     javaRunning = false; 
} 

當Java函數WindowClosing(Event)被調用來指示用戶關閉窗口時,該值將被改變。

不幸的是,如果關閉窗口,這不起作用。即使窗口已關閉,C應用程序仍會嘗試請求布爾值。它顯然無法在窗口關閉前獲取布爾值。 更好的方法是從Java調用C代碼來通知它「WindowClosing」事件。

就我所見,如果C代碼是由Java加載(使用DLL)而不是通過調用接口加載C instanciates並啓動Java應用程序,那麼這將是可能的。 也許任何人都知道如何解決這個問題。

+1

如果你已經回答了你自己的問題,你應該在下面發表答案作爲答案並接受它 - 這是完全有效的,並且避免每個人都打開問題,因爲他們認爲這是沒有答案的。 – Steve 2012-02-13 15:45:06

+0

當然我會這樣做 - 不幸的是,我不能在接下來的6小時內這樣做... – SideEffect 2012-02-13 16:04:10

回答

1

經過一段時間的嘗試/錯誤後好了;我剛剛意識到,有時只是檢查哪些方法可用於JNI(RTFM;))

無論如何,它不是真正的黑魔法,並且的確的確有可能,因爲有些人投票在這裏顯然有一些興趣這個問題。

那麼,如果我們想打開一個可從Java調用的本地方法,即使它在exec中,我們也能做些什麼?我們必須註冊它並交出一個函數指針! 這就是它看起來像在C:

//this is the function that shall be called from Java code 
void JNICALL setWindowClosed(JNIEnv *env, jobject self, jboolean b){ 
    statusByte = (b==JNI_TRUE) ? true : false; 
} 

int main(){ 
JNIEnv* env; 
JavaVM* jvm; 
/* 
create JavaVM and instantiate desired class 

JNI_CreateJavaVM(...) 
*/  
jclass cls = env->FindClass("ClassName"); 

//we have our class - now register our function 
JNINativeMethod nativeMethod; 
nativeMethod.name = "setWindowClosing"; //this is the corresponding name in Java 
nativeMethod.signature = "(Z)V"; //parameter contains a boolean and returns void 
nativeMethod.fnPtr = setWindowClosed; //pointer to our function 
env->RegisterNatives(cls, &nativeMethod, 1); //register native method to Java 
} 

此外,我們還需要將一個函數的名稱在上面的Java代碼:

private native void setWindowClosing(boolean b); 

完蛋了 - 調用函數在Java和它將使用C/C++中的實現。如果我的窗口現在關閉,我的應用程序正常關閉:)

0

Yout可以爲IPC等待「關閉」消息打開一個套接字。它幾乎是語言不可知的,並且具有lotdocumentation

相關問題