JNI 主动回调java

2022-01-09  本文已影响0人  吉吉的纸飞机

感谢分享,写的很详细
https://www.jianshu.com/p/e576c7e1c403

核心
全局 java 上下文对象
反射


 public void updateEvent(Event event) {
        //TODO
}
       void JniClient::updateEvent(int position, int action, float *pointerCoords) {
        JNIEnv *env;

        int getEnvStat = j_VM->GetEnv((void **) &env, JNI_VERSION_1_6);
        if (getEnvStat == JNI_EDETACHED) {
            if (j_VM->AttachCurrentThread(&env, nullptr) != 0) {
                return;
            }
        }

        jclass javaClass = env->GetObjectClass(jDeviceClient);

        if (javaClass == nullptr) {
            IVR_LOG_DEBUG("Unable to find class");
            j_VM->DetachCurrentThread();
            return;
        }

        jmethodID javaCallbackId = env->GetMethodID(javaClass, "updateEvent", "(Lcom/xxx/Event;)V");
        if (javaCallbackId == nullptr) {
            IVR_LOG_DEBUG("Unable to find method:onProgressCallBack");
            return;
        }
        jclass PointerCoords = env->FindClass("com/xxx/PointerCoords");
        jmethodID sdkInit = env->GetMethodID(PointerCoords, "<init>", "(FF)V");
        jobject jObject = env->NewObject(PointerCoords, sdkInit, pointerCoords[0], pointerCoords[1]);

        jclass event = env->FindClass("com/xxxx/Event");
        jmethodID eventInit = env->GetMethodID(event , "<init>", "(IILcom/xxxx/PointerCoords;)V");
        jobject jEvent= env->NewObject(event , eventInit , position, action, jObject );

        env->CallVoidMethod(jDeviceClient, javaCallbackId, jEvent);
        env->DeleteLocalRef(jControllerEvent);
        env->DeleteLocalRef(jUSBDeviceInfoObject);

        env = nullptr;
    }
上一篇 下一篇

猜你喜欢

热点阅读