我可以从Java调用C-Executable的函数吗?

时间:2012-02-13 14:22:18

标签: java c java-native-interface

我使用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应用程序。 也许有人知道如何解决这个问题。

2 个答案:

答案 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打开一个等待“关闭”消息的套接字。它几乎与语言无关,并且lotdocumentation