#include <jni.h>\r
\r
+#include "opencv2/core/core.hpp"\r
+\r
+#include <android/bitmap.h>\r
+\r
#ifdef __cplusplus\r
extern "C" {\r
#endif\r
* Method: nBitmapToMat(Bitmap b)\r
* Signature: (L)J\r
*/\r
-JNIEXPORT jlong JNICALL Java_org_opencv_utils_nBitmapToMat\r
- (JNIEnv *, jclass, jobject);\r
-\r
-/*\r
- * Class: org_opencv_utils\r
- * Method: nBitmapToMat(long m, Bitmap b)\r
- * Signature: (JL)Z\r
- */\r
-JNIEXPORT jboolean JNICALL Java_org_opencv_utils_nMatToBitmap\r
- (JNIEnv *, jclass, jlong, jobject);\r
-\r
-\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#include "opencv2/core/core.hpp"\r
-\r
-#include <android/bitmap.h>\r
\r
JNIEXPORT jlong JNICALL Java_org_opencv_utils_nBitmapToMat\r
(JNIEnv * env, jclass cls, jobject bitmap)\r
{\r
AndroidBitmapInfo info;\r
void* pixels;\r
- cv::Mat* m = NULL;\r
+ cv::Mat* m = new cv::Mat();\r
\r
if ( AndroidBitmap_getInfo(env, bitmap, &info) < 0 )\r
- return 0; // can't get info\r
+ return (jlong)m; // can't get info\r
\r
if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888)\r
- return 0; // incompatible format\r
+ return (jlong)m; // incompatible format\r
\r
if ( AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0 )\r
- return 0; // can't get pixels\r
+ return (jlong)m; // can't get pixels\r
\r
- m = new cv::Mat(info.height, info.width, CV_8UC4);\r
- memcpy(m->data, pixels, info.height * info.width * 4);\r
+ m->create(info.height, info.width, CV_8UC4);\r
+ if(m->data && pixels)\r
+ memcpy(m->data, pixels, info.height * info.width * 4);\r
\r
AndroidBitmap_unlockPixels(env, bitmap);\r
\r
- return (jlong)m;\r
+ return (jlong)m;\r
}\r
\r
+/*\r
+ * Class: org_opencv_utils\r
+ * Method: nBitmapToMat(long m, Bitmap b)\r
+ * Signature: (JL)Z\r
+ */\r
JNIEXPORT jboolean JNICALL Java_org_opencv_utils_nMatToBitmap\r
(JNIEnv * env, jclass cls, jlong m, jobject bitmap)\r
{\r
AndroidBitmapInfo info;\r
void* pixels;\r
- cv::Mat* mat = (cv::Mat*) m;\r
+ cv::Mat* mat = (cv::Mat*) m;\r
\r
- if ( m == 0 )\r
- return false; // no native Mat behind\r
+ if ( mat == 0 || mat->data == 0)\r
+ return false; // no native Mat behind\r
\r
- if ( AndroidBitmap_getInfo(env, bitmap, &info) < 0 )\r
+ if ( AndroidBitmap_getInfo(env, bitmap, &info) < 0 )\r
return false; // can't get info\r
\r
if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888)\r
if ( AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0 )\r
return false; // can't get pixels\r
\r
- memcpy(pixels, mat->data, info.height * info.width * 4);\r
+ if(mat->data && pixels)\r
+ memcpy(pixels, mat->data, info.height * info.width * 4);\r
\r
AndroidBitmap_unlockPixels(env, bitmap);\r
\r
- return true;\r
+ return true;\r
}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r