我使用JNI从C启动Java应用程序。虽然只要我使用控制台应用程序就可以快速完成,但是使用Swing-GUI会让事情变得有点棘手。
为了保持应用程序“活着”,我使用一个只在GUI未关闭时运行的while循环。当这个循环运行时,如果应用程序仍在通过请求布尔值运行,它总是请求。
while(javaRunning){
if(JNI_FALSE == env->CallBooleanMethod(obj, boolMethod))
javaRunning = false;
}
当调用Java函数WindowClosing(Event)以指示用户关闭窗口时,此值会更改。
不幸的是,如果我关闭窗口,这不起作用。即使窗口已经关闭,C-Application仍会尝试请求布尔值。它显然无法在窗口关闭之前获取布尔值。 更好的方法是从Java调用C代码以通知它“WindowClosing”事件。
据我所知,如果C代码由Java(使用DLL)加载但是不是通过调用接口C可以实现,并且启动Java应用程序。 也许有人知道如何解决这个问题。
答案 0 :(得分: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 ++中的实现。如果我的窗口现在关闭,我的应用程序将正常关闭:)
答案 1 :(得分:0)
Yout可以为IPC打开一个等待“关闭”消息的套接字。它几乎与语言无关,并且lot为documentation