Как вызвать функцию обратного вызова Java-апплета из собственного кода C / C ++, используя JNI. - PullRequest
0 голосов
/ 03 ноября 2011

Как вызвать функцию обратного вызова Java-апплета из собственного кода C / C ++ с использованием JNI. Пожалуйста, дайте мне знать, как это можно сделать правильно. Пожалуйста, любой фрагмент кода будет полезен.

// Java Applet code

public class TestApp extends Applet {

    private native void TestMethod(int nValue);

    public void callback(int nValue) {
            // DISPLAY SOME MESSAGE FROM NATIVE DLL RECEIVED

    }

     static {
        System.load("c/temp/TestDll.dll");
  }
}

// TestDll.cpp

JNIEnv *g_env;
jobject g_object;
jmethodID g_method;




   JNIEXPORT void JNICALL
    Java_Callbacks_TestMethod(JNIEnv *env, jobject obj, jint Value)
    {
        jclass cls = (*env)->GetObjectClass(env, obj);
        jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");      

        g_env = env;
        g_Object = obj;
        g_method = mid
    }

        // Cannot be called within the above function
    void TestDllCallbackFunction (int nValue)
    {

            // This is where i want to call the Java callback function… would the below work???
        (*g_env)->CallVoidMethod(g_env, g_object, g_method, ((jint)Value);
    }

1 Ответ

0 голосов
/ 24 января 2012

Вы должны также рассмотреть другое решение как альтернативу обратным вызовам из C ++ в Java:

  • Создать дополнительный поток Java для ожидания ответа от C ++
  • Пусть этот поток Java вызывает функцию C ++, которая блокирует переменную условия (или аналогичную, в зависимости от вашей ОС), пока ответ не будет готов к возвращению.
  • Если вы хотите вызвать обратный вызов, пусть указанная выше функция C ++ имеет данные и сигнализирует переменную условия. Затем он может вернуть данные.

Обратные вызовы через JNI, безусловно, могут быть выполнены, но я думаю, что они добавляют ненужную сложность. Используя описанный выше метод, вы можете держать вещи более красиво разделенными ИМХО.

...