JIN C ++ с Springboot (Tomcat ENV-> FindClass возвращает ноль) - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь вызвать функцию java на C ++. Он отлично работает в Eclipse IDE, но когда я строю войну и работаю в tomcat. Я могу вызвать функцию C ++ из приложения Springboot. Но не удалось вызвать функцию java из C ++. Поскольку он не может найти класс, который я упомянул с пакетом.

Ниже приведен мой пример кода. В любом случае, это исправить?

мой код C ++

void myClientEvents::SendEvents(const char* ack) {
    //Get current thread JNIEnv
    JNIEnv * ENV;



    WriteLogFile("Get current thread JNIEnv");


    try {
        WriteLogFile(ack);

        int stat = savedVM->GetEnv((void **)&ENV, JNI_VERSION_1_8);

        WriteLogFile("stat");
        if (stat == JNI_EDETACHED)  //We are on a different thread, attach
        {
            WriteLogFile("We are on a different thread, attach");
            savedVM->AttachCurrentThread((void **)&ENV, NULL);


        }
        if (ENV == NULL)
        {
            WriteLogFile("Cant attach to java, bail");
             //Cant attach to java, bail
        }

        //Get the Listener class reference
        if (saved_listener_instance != NULL) {
            WriteLogFile("Get the Listener class reference");


            jclass listenerClassRef = ENV->FindClass("org/trinity/serviceImpl/CadiAstroServiceImpl");

            if (listenerClassRef==NULL)
            {
                WriteLogFile("Class Not found"); //This line is printing for tomcat
            }

            WriteLogFile("Use Listener class reference to load the eventOccurred method");

              //Not moving forward from above log in tomcat
            jmethodID ctor = ENV->GetMethodID(listenerClassRef, "<init>", "()V");

            jobject object = ENV->NewObject(listenerClassRef, ctor);
            //Use Listener class reference to load the eventOccurred method
            jmethodID listenerEventOccured = ENV->GetMethodID(listenerClassRef, "eventOccurred", "(Ljava/lang/String;)V");

            WriteLogFile("jmethodID created");

            jstring jstr = ENV->NewStringUTF(ack);

            WriteLogFile("invoke listener eventOccurred");
            //invoke listener eventOccurred
            ENV->CallVoidMethod(object, listenerEventOccured, jstr);

            ENV->DeleteLocalRef(jstr);
            ENV->DeleteLocalRef(object);
            ENV->DeleteLocalRef(listenerClassRef);
        }
        else {
            WriteLogFile("Error getting class");
        }
    }
    catch (const char* msg) {

        WriteLogFile(msg);
    }
}

мой java метод в указанном классе

public void eventOccurred(String info) {

        System.out.println(info);

    }
...