diff --git a/modules/java/gen_java.py b/modules/java/gen_java.py index f9b291fd2b..7e2e7f9b13 100644 --- a/modules/java/gen_java.py +++ b/modules/java/gen_java.py @@ -624,6 +624,7 @@ JNIEXPORT $rtype JNICALL Java_org_opencv_${module}_$fname ) self.java_code.write(indent_m + "// native stuff\n\n") + self.java_code.write(indent_m + 'static { System.loadLibrary("opencv_java"); }\n') self.java_code.write( jn_code.getvalue() ) self.java_code.write( """ diff --git a/modules/java/src/cpp/utils.cpp b/modules/java/src/cpp/utils.cpp index 2d016a03f2..5f069a7a67 100644 --- a/modules/java/src/cpp/utils.cpp +++ b/modules/java/src/cpp/utils.cpp @@ -1,5 +1,9 @@ #include +#include "opencv2/core/core.hpp" + +#include + #ifdef __cplusplus extern "C" { #endif @@ -9,62 +13,48 @@ extern "C" { * Method: nBitmapToMat(Bitmap b) * Signature: (L)J */ -JNIEXPORT jlong JNICALL Java_org_opencv_utils_nBitmapToMat - (JNIEnv *, jclass, jobject); - -/* - * Class: org_opencv_utils - * Method: nBitmapToMat(long m, Bitmap b) - * Signature: (JL)Z - */ -JNIEXPORT jboolean JNICALL Java_org_opencv_utils_nMatToBitmap - (JNIEnv *, jclass, jlong, jobject); - - - -#ifdef __cplusplus -} -#endif - -#include "opencv2/core/core.hpp" - -#include JNIEXPORT jlong JNICALL Java_org_opencv_utils_nBitmapToMat (JNIEnv * env, jclass cls, jobject bitmap) { AndroidBitmapInfo info; void* pixels; - cv::Mat* m = NULL; + cv::Mat* m = new cv::Mat(); if ( AndroidBitmap_getInfo(env, bitmap, &info) < 0 ) - return 0; // can't get info + return (jlong)m; // can't get info if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) - return 0; // incompatible format + return (jlong)m; // incompatible format if ( AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0 ) - return 0; // can't get pixels + return (jlong)m; // can't get pixels - m = new cv::Mat(info.height, info.width, CV_8UC4); - memcpy(m->data, pixels, info.height * info.width * 4); + m->create(info.height, info.width, CV_8UC4); + if(m->data && pixels) + memcpy(m->data, pixels, info.height * info.width * 4); AndroidBitmap_unlockPixels(env, bitmap); - return (jlong)m; + return (jlong)m; } +/* + * Class: org_opencv_utils + * Method: nBitmapToMat(long m, Bitmap b) + * Signature: (JL)Z + */ JNIEXPORT jboolean JNICALL Java_org_opencv_utils_nMatToBitmap (JNIEnv * env, jclass cls, jlong m, jobject bitmap) { AndroidBitmapInfo info; void* pixels; - cv::Mat* mat = (cv::Mat*) m; + cv::Mat* mat = (cv::Mat*) m; - if ( m == 0 ) - return false; // no native Mat behind + if ( mat == 0 || mat->data == 0) + return false; // no native Mat behind - if ( AndroidBitmap_getInfo(env, bitmap, &info) < 0 ) + if ( AndroidBitmap_getInfo(env, bitmap, &info) < 0 ) return false; // can't get info if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) @@ -73,9 +63,14 @@ JNIEXPORT jboolean JNICALL Java_org_opencv_utils_nMatToBitmap if ( AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0 ) return false; // can't get pixels - memcpy(pixels, mat->data, info.height * info.width * 4); + if(mat->data && pixels) + memcpy(pixels, mat->data, info.height * info.width * 4); AndroidBitmap_unlockPixels(env, bitmap); - return true; + return true; } + +#ifdef __cplusplus +} +#endif