text: #include "OpenCVEngine_jni.h"
  #include "EngineCommon.h"
  #include "IOpenCVEngine.h"
  #include "OpenCVEngine.h"
  #include "IPackageManager.h"
  #include "JavaBasedPackageManager.h"
  #include <utils/Log.h>
  #include <android_util_Binder.h>
  
  #undef LOG_TAG
  #define LOG_TAG "OpenCVEngine/JNI"
  
  using namespace android;
  
  sp<IBinder> OpenCVEngineBinder = NULL;
  IPackageManager* PackageManager = NULL;
  
  JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect(JNIEnv* env, jobject)
  {
      LOGI("Creating new component");
      if (NULL != OpenCVEngineBinder.get())
      {
          LOGI("New component created successfully");
      }
      else
      {
          LOGE("OpenCV Engine component was not created!");
      }
  
      return javaObjectForIBinder(env, OpenCVEngineBinder);
  }
  
  JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init(JNIEnv* env, jobject , jobject market)
  {
      LOGD("Java_org_opencv_engine_BinderConnector_Init");
  
      if (NULL == PackageManager)
      {
          JavaVM* jvm;
          env->GetJavaVM(&jvm);
          PackageManager = new JavaBasedPackageManager(jvm, env->NewGlobalRef(market));
      }
      if (PackageManager)
      {
          if (!OpenCVEngineBinder.get())
          {
              OpenCVEngineBinder = new OpenCVEngine(PackageManager);
              return (NULL != OpenCVEngineBinder.get());
          }
          else
          {
              return true;
          }
      }
      else
      {
          return false;
      }
  }
  
  JNIEXPORT void JNICALL Java_org_opencv_engine_BinderConnector_Final(JNIEnv *, jobject)
  {
      LOGD("Java_org_opencv_engine_BinderConnector_Final");
  
      OpenCVEngineBinder = NULL;
  
      delete PackageManager;
      PackageManager = NULL;
  }
  