From a88360bea64bb1bf9e8a2464b39e57ab4c3b5651 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Thu, 31 Oct 2013 12:42:12 +0400 Subject: [PATCH] minor refactoring of Android VideoCapture jni code to make it similar to generated one --- modules/java/generator/src/cpp/VideoCapture.cpp | 274 +++++++++--------------- 1 file changed, 99 insertions(+), 175 deletions(-) diff --git a/modules/java/generator/src/cpp/VideoCapture.cpp b/modules/java/generator/src/cpp/VideoCapture.cpp index 5b92666..a9d0a56 100644 --- a/modules/java/generator/src/cpp/VideoCapture.cpp +++ b/modules/java/generator/src/cpp/VideoCapture.cpp @@ -8,6 +8,28 @@ #include "opencv2/highgui/highgui.hpp" using namespace cv; +/// throw java exception +static void throwJavaException(JNIEnv *env, const std::exception *e, const char *method) { + std::string what = "unknown exception"; + jclass je = 0; + + if(e) { + std::string exception_type = "std::exception"; + + if(dynamic_cast(e)) { + exception_type = "cv::Exception"; + je = env->FindClass("org/opencv/core/CvException"); + } + + what = exception_type + ": " + e->what(); + } + + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, what.c_str()); + + LOGE("%s caught %s", method, what.c_str()); + (void)method; // avoid "unused" warning +} extern "C" { @@ -21,24 +43,17 @@ JNIEXPORT jlong JNICALL Java_org_opencv_highgui_VideoCapture_n_1VideoCapture__ JNIEXPORT jlong JNICALL Java_org_opencv_highgui_VideoCapture_n_1VideoCapture__ (JNIEnv* env, jclass) { + static const char method_name[] = "highgui::VideoCapture::VideoCapture()"; try { - LOGD("highgui::VideoCapture_n_1VideoCapture__()"); - + LOGD("%s", method_name); VideoCapture* _retval_ = new VideoCapture( ); - return (jlong) _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1VideoCapture__() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1VideoCapture__() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); - return 0; + throwJavaException(env, 0, method_name); } + return 0; } @@ -52,24 +67,17 @@ JNIEXPORT jlong JNICALL Java_org_opencv_highgui_VideoCapture_n_1VideoCapture__I JNIEXPORT jlong JNICALL Java_org_opencv_highgui_VideoCapture_n_1VideoCapture__I (JNIEnv* env, jclass, jint device) { + static const char method_name[] = "highgui::VideoCapture::VideoCapture(int device)"; try { - LOGD("highgui::VideoCapture_n_1VideoCapture__I()"); - + LOGD("%s", method_name); VideoCapture* _retval_ = new VideoCapture( device ); - return (jlong) _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1VideoCapture__I() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1VideoCapture__I() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__I()}"); - return 0; + throwJavaException(env, 0, method_name); } + return 0; } @@ -84,24 +92,18 @@ JNIEXPORT jdouble JNICALL Java_org_opencv_highgui_VideoCapture_n_1get JNIEXPORT jdouble JNICALL Java_org_opencv_highgui_VideoCapture_n_1get (JNIEnv* env, jclass, jlong self, jint propId) { + static const char method_name[] = "highgui::VideoCapture::get(int propId)"; try { - LOGD("highgui::VideoCapture_n_1get()"); + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL double _retval_ = me->get( propId ); - return _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1get() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1get() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1get()}"); - return 0; + throwJavaException(env, 0, method_name); } + return 0; } @@ -116,24 +118,18 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1grab JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1grab (JNIEnv* env, jclass, jlong self) { + static const char method_name[] = "highgui::VideoCapture::grab()"; try { - LOGD("highgui::VideoCapture_n_1grab()"); + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL bool _retval_ = me->grab( ); - return _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1grab() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1grab() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1grab()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } @@ -148,24 +144,18 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1isOpened JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1isOpened (JNIEnv* env, jclass, jlong self) { + static const char method_name[] = "highgui::VideoCapture::isOpened()"; try { - LOGD("highgui::VideoCapture_n_1isOpened()"); + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL bool _retval_ = me->isOpened( ); - return _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1isOpened() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1isOpened() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1isOpened()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } @@ -179,24 +169,18 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1open__JI JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1open__JI (JNIEnv* env, jclass, jlong self, jint device) { + static const char method_name[] = "highgui::VideoCapture::open(int device)"; try { - LOGD("highgui::VideoCapture_n_1open__JI()"); + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL bool _retval_ = me->open( device ); - return _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1open__JI() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1open__JI() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1open__JI()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } @@ -211,25 +195,19 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1read JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1read (JNIEnv* env, jclass, jlong self, jlong image_nativeObj) { + static const char method_name[] = "highgui::VideoCapture::read(Mat image)"; try { - LOGD("highgui::VideoCapture_n_1read()"); + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL Mat& image = *((Mat*)image_nativeObj); bool _retval_ = me->read( image ); - return _retval_; - } catch(cv::Exception e) { - LOGD("highgui::VideoCapture_n_1read() catched cv::Exception: %s", e.what()); - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - LOGD("highgui::VideoCapture_n_1read() catched unknown exception (...)"); - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1read()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } @@ -244,30 +222,18 @@ JNIEXPORT void JNICALL Java_org_opencv_highgui_VideoCapture_n_1release JNIEXPORT void JNICALL Java_org_opencv_highgui_VideoCapture_n_1release (JNIEnv* env, jclass, jlong self) { + static const char method_name[] = "highgui::VideoCapture::release()"; try { - - LOGD("highgui::VideoCapture_n_1release()"); - + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL me->release( ); - - return; - } catch(cv::Exception e) { - - LOGD("highgui::VideoCapture_n_1release() catched cv::Exception: %s", e.what()); - - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); return; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - - LOGD("highgui::VideoCapture_n_1release() catched unknown exception (...)"); - - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1release()}"); - return; + throwJavaException(env, 0, method_name); } + return; } @@ -282,31 +248,19 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1retrieve__JJI JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1retrieve__JJI (JNIEnv* env, jclass, jlong self, jlong image_nativeObj, jint channel) { + static const char method_name[] = "highgui::VideoCapture::retrieve(Mat image, int channel)"; try { - - LOGD("highgui::VideoCapture_n_1retrieve__JJI()"); - + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL Mat& image = *((Mat*)image_nativeObj); bool _retval_ = me->retrieve( image, channel ); - return _retval_; - } catch(cv::Exception e) { - - LOGD("highgui::VideoCapture_n_1retrieve__JJI() catched cv::Exception: %s", e.what()); - - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - - LOGD("highgui::VideoCapture_n_1retrieve__JJI() catched unknown exception (...)"); - - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1retrieve__JJI()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } @@ -317,31 +271,19 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1retrieve__JJ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1retrieve__JJ (JNIEnv* env, jclass, jlong self, jlong image_nativeObj) { + static const char method_name[] = "highgui::VideoCapture::retrieve(Mat image)"; try { - - LOGD("highgui::VideoCapture_n_1retrieve__JJ()"); - + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL Mat& image = *((Mat*)image_nativeObj); bool _retval_ = me->retrieve( image ); - return _retval_; - } catch(cv::Exception e) { - - LOGD("highgui::VideoCapture_n_1retrieve__JJ() catched cv::Exception: %s", e.what()); - - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - - LOGD("highgui::VideoCapture_n_1retrieve__JJ() catched unknown exception (...)"); - - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1retrieve__JJ()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } @@ -356,62 +298,44 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1set JNIEXPORT jboolean JNICALL Java_org_opencv_highgui_VideoCapture_n_1set (JNIEnv* env, jclass, jlong self, jint propId, jdouble value) { + static const char method_name[] = "highgui::VideoCapture::set(int propId, double value)"; try { - - LOGD("highgui::VideoCapture_n_1set()"); - + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL bool _retval_ = me->set( propId, value ); - return _retval_; - } catch(cv::Exception e) { - - LOGD("highgui::VideoCapture_n_1set() catched cv::Exception: %s", e.what()); - - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return 0; + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - - LOGD("highgui::VideoCapture_n_1set() catched unknown exception (...)"); - - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1set()}"); - return 0; + throwJavaException(env, 0, method_name); } + return false; } + +// +// string VideoCapture::getSupportedPreviewSizes(...) +// + JNIEXPORT jstring JNICALL Java_org_opencv_highgui_VideoCapture_n_1getSupportedPreviewSizes (JNIEnv *env, jclass, jlong self); JNIEXPORT jstring JNICALL Java_org_opencv_highgui_VideoCapture_n_1getSupportedPreviewSizes (JNIEnv *env, jclass, jlong self) { + static const char method_name[] = "highgui::VideoCapture::getSupportedPreviewSizes(...)"; try { - - LOGD("highgui::VideoCapture_n_1set()"); - + LOGD("%s", method_name); VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL union {double prop; const char* name;} u; u.prop = me->get(CV_CAP_PROP_SUPPORTED_PREVIEW_SIZES_STRING); return env->NewStringUTF(u.name); - } catch(cv::Exception e) { - - LOGD("highgui::VideoCapture_n_1getSupportedPreviewSizes() catched cv::Exception: %s", e.what()); - - jclass je = env->FindClass("org/opencv/core/CvException"); - if(!je) je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, e.what()); - return env->NewStringUTF(""); + } catch(const std::exception &e) { + throwJavaException(env, &e, method_name); } catch (...) { - - LOGD("highgui::VideoCapture_n_1getSupportedPreviewSizes() catched unknown exception (...)"); - - jclass je = env->FindClass("java/lang/Exception"); - env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1getSupportedPreviewSizes()}"); - return env->NewStringUTF(""); + throwJavaException(env, 0, method_name); } + return env->NewStringUTF(""); } -- 2.7.4