text: #include "FaceTracker_jni.h"
  #include <opencv2/core/core.hpp>
  #include <opencv2/contrib/detection_based_tracker.hpp>
  
  #include <string>
  #include <vector>
  
  #include <android/log.h>
  
  #define LOG_TAG "FaceTracker"
  #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
  
  using namespace std;
  using namespace cv;
  
  inline void vector_Rect_to_Mat(vector<Rect>& v_rect, Mat& mat)
  {
      mat = Mat(v_rect, true);
  }
  
  JNIEXPORT jlong JNICALL Java_conex_facerecognition_FaceTracker_nativeCreateObject
  (JNIEnv * jenv, jclass, jstring jFileName, jint faceSize)
  {
      LOGD("Java_conex_facerecognition_FaceTracker_nativeCreateObject enter");
      const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL);
      string stdFileName(jnamestr);
      jlong result = 0;
  
      try
      {
          DetectionBasedTracker::Parameters DetectorParams;
          if (faceSize > 0)
              DetectorParams.minObjectSize = faceSize;
          result = (jlong)new DetectionBasedTracker(stdFileName, DetectorParams);
      }
      catch(cv::Exception& e)
      {
          LOGD("nativeCreateObject caught cv::Exception: %s", e.what());
          jclass je = jenv->FindClass("org/opencv/core/CvException");
          if(!je)
              je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, e.what());
      }
      catch (...)
      {
          LOGD("nativeCreateObject caught unknown exception");
          jclass je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, "Unknown exception in JNI code of FaceTracker.nativeCreateObject()");
          return 0;
      }
  
      LOGD("Java_conex_facerecognition_FaceTracker_nativeCreateObject exit");
      return result;
  }
  
  JNIEXPORT void JNICALL Java_conex_facerecognition_FaceTracker_nativeDestroyObject
  (JNIEnv * jenv, jclass, jlong thiz)
  {
      LOGD("Java_conex_facerecognition_FaceTracker_nativeDestroyObject enter");
      try
      {
          if(thiz != 0)
          {
              ((DetectionBasedTracker*)thiz)->stop();
              delete (DetectionBasedTracker*)thiz;
          }
      }
      catch(cv::Exception& e)
      {
          LOGD("nativeestroyObject caught cv::Exception: %s", e.what());
          jclass je = jenv->FindClass("org/opencv/core/CvException");
          if(!je)
              je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, e.what());
      }
      catch (...)
      {
          LOGD("nativeDestroyObject caught unknown exception");
          jclass je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, "Unknown exception in JNI code of FaceTracker.nativeDestroyObject()");
      }
      LOGD("Java_conex_facerecognition_FaceTracker_nativeDestroyObject exit");
  }
  
  JNIEXPORT void JNICALL Java_conex_facerecognition_FaceTracker_nativeStart
  (JNIEnv * jenv, jclass, jlong thiz)
  {
      LOGD("Java_conex_facerecognition_FaceTracker_nativeStart enter");
      try
      {
          ((DetectionBasedTracker*)thiz)->run();
      }
      catch(cv::Exception& e)
      {
          LOGD("nativeStart caught cv::Exception: %s", e.what());
          jclass je = jenv->FindClass("org/opencv/core/CvException");
          if(!je)
              je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, e.what());
      }
      catch (...)
      {
          LOGD("nativeStart caught unknown exception");
          jclass je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, "Unknown exception in JNI code of FaceTracker.nativeStart()");
      }
      LOGD("Java_conex_facerecognition_FaceTracker_nativeStart exit");
  }
  
  JNIEXPORT void JNICALL Java_conex_facerecognition_FaceTracker_nativeStop
  (JNIEnv * jenv, jclass, jlong thiz)
  {
      LOGD("Java_conex_facerecognition_FaceTracker_nativeStop enter");
      try
      {
          ((DetectionBasedTracker*)thiz)->stop();
      }
      catch(cv::Exception& e)
      {
          LOGD("nativeStop caught cv::Exception: %s", e.what());
          jclass je = jenv->FindClass("org/opencv/core/CvException");
          if(!je)
              je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, e.what());
      }
      catch (...)
      {
          LOGD("nativeStop caught unknown exception");
          jclass je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, "Unknown exception in JNI code of FaceTracker.nativeStop()");
      }
      LOGD("Java_conex_facerecognition_FaceTracker_nativeStop exit");
  }
  
  JNIEXPORT void JNICALL Java_conex_facerecognition_FaceTracker_nativeSetFaceSize
  (JNIEnv * jenv, jclass, jlong thiz, jint faceSize)
  {
      LOGD("Java_conex_facerecognition_FaceTracker_nativeSetFaceSize enter");
      try
      {
          if (faceSize > 0)
          {
              DetectionBasedTracker::Parameters DetectorParams = \
              ((DetectionBasedTracker*)thiz)->getParameters();
              DetectorParams.minObjectSize = faceSize;
              ((DetectionBasedTracker*)thiz)->setParameters(DetectorParams);
          }
      }
      catch(cv::Exception& e)
      {
          LOGD("nativeStop caught cv::Exception: %s", e.what());
          jclass je = jenv->FindClass("org/opencv/core/CvException");
          if(!je)
              je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, e.what());
      }
      catch (...)
      {
          LOGD("nativeSetFaceSize caught unknown exception");
          jclass je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, "Unknown exception in JNI code of FaceTracker.nativeSetFaceSize()");
      }
      LOGD("Java_conex_facerecognition_FaceTracker_nativeSetFaceSize exit");
  }
  
  
  JNIEXPORT void JNICALL Java_conex_facerecognition_FaceTracker_nativeDetect
  (JNIEnv * jenv, jclass, jlong thiz, jlong imageGray, jlong faces)
  {
      LOGD("Java_conex_facerecognition_FaceTracker_nativeDetect enter");
      try
      {
          vector<Rect> RectFaces;
          ((DetectionBasedTracker*)thiz)->process(*((Mat*)imageGray));
          ((DetectionBasedTracker*)thiz)->getObjects(RectFaces);
          vector_Rect_to_Mat(RectFaces, *((Mat*)faces));
      }
      catch(cv::Exception& e)
      {
          LOGD("nativeCreateObject caught cv::Exception: %s", e.what());
          jclass je = jenv->FindClass("org/opencv/core/CvException");
          if(!je)
              je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, e.what());
      }
      catch (...)
      {
          LOGD("nativeDetect caught unknown exception");
          jclass je = jenv->FindClass("java/lang/Exception");
          jenv->ThrowNew(je, "Unknown exception in JNI code FaceTracker.nativeDetect()");
      }
      LOGD("Java_conex_facerecognition_FaceTracker_nativeDetect exit");
  }
  