2012-02-13 80 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

相关问题