Могу ли я вызвать функции C-Executable из Java? - PullRequest
3 голосов
/ 13 февраля 2012

Я использую JNI для запуска Java-приложения из C. Хотя это быстро делается, пока я использую консольное приложение, с Swing-GUI все становится немного сложнее.

Длячтобы приложение оставалось «живым», я использую цикл while, который работает, пока GUI не закрыт.Во время выполнения этого цикла он всегда запрашивает, если приложение все еще выполняется, запрашивая логическое значение.

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

Это значение изменяется, когда вызывается Java-функция WindowClosing (Event), чтобы указать, что пользователь закрывает окно.

К сожалению, это не работает, если я закрываю окно.Приложение C все еще пытается запросить логическое значение, даже если окно уже закрыто.Очевидно, он не может получить логическое значение до закрытия окна.Лучшим подходом было бы вызвать C-код из Java, чтобы сообщить ему о событии "WindowClosing".

Ну, насколько я могу видеть, это было бы возможно, если бы C-код загружался Java(с использованием DLL), но не через интерфейс вызова, где C был запущен и запускает приложение Java.Может быть, кто-нибудь знает, как обойти это.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Хорошо, через некоторое время попытки / ошибки;Я только что понял, что иногда может быть полезно просто проверить, какие методы доступны в 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 голосов
/ 13 февраля 2012

Yout может открыть сокет для IPC, ожидающего сообщения «close».Он почти не зависит от языка и имеет лот из документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...