diff --git a/modules/java/android_test/.classpath b/modules/java/android_test/.classpath
new file mode 100644
index 0000000000..927cc0b57d
--- /dev/null
+++ b/modules/java/android_test/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/modules/java/android_test/.project b/modules/java/android_test/.project
new file mode 100644
index 0000000000..01fcaa8b11
--- /dev/null
+++ b/modules/java/android_test/.project
@@ -0,0 +1,41 @@
+
+
+ OpenCV_Test
+
+
+ OpenCVJavaAPI
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
+
+ OpenCVJavaAPI_src
+ 2
+ _android_OpenCVJavaAPI_583dbd7b/src
+
+
+
diff --git a/modules/java/android_test/AndroidManifest.xml b/modules/java/android_test/AndroidManifest.xml
new file mode 100644
index 0000000000..aae85eb404
--- /dev/null
+++ b/modules/java/android_test/AndroidManifest.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/java/android_test/default.properties b/modules/java/android_test/default.properties
new file mode 100644
index 0000000000..c198130c55
--- /dev/null
+++ b/modules/java/android_test/default.properties
@@ -0,0 +1,12 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-8
+android.library.reference.1=../android/build
diff --git a/modules/java/android_test/res/drawable-hdpi/icon.png b/modules/java/android_test/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000000..8074c4c571
Binary files /dev/null and b/modules/java/android_test/res/drawable-hdpi/icon.png differ
diff --git a/modules/java/android_test/res/drawable-ldpi/icon.png b/modules/java/android_test/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000000..1095584ec2
Binary files /dev/null and b/modules/java/android_test/res/drawable-ldpi/icon.png differ
diff --git a/modules/java/android_test/res/drawable-mdpi/icon.png b/modules/java/android_test/res/drawable-mdpi/icon.png
new file mode 100644
index 0000000000..a07c69fa5a
Binary files /dev/null and b/modules/java/android_test/res/drawable-mdpi/icon.png differ
diff --git a/modules/java/android_test/res/layout/main.xml b/modules/java/android_test/res/layout/main.xml
new file mode 100644
index 0000000000..3a5f117d3c
--- /dev/null
+++ b/modules/java/android_test/res/layout/main.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/modules/java/android_test/res/values/strings.xml b/modules/java/android_test/res/values/strings.xml
new file mode 100644
index 0000000000..f6f4876f0f
--- /dev/null
+++ b/modules/java/android_test/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Hello World!
+ OpenCV_Test
+
diff --git a/modules/java/android_test/src/org/opencv_test/CoreTest.java b/modules/java/android_test/src/org/opencv_test/CoreTest.java
new file mode 100644
index 0000000000..22c15378ff
--- /dev/null
+++ b/modules/java/android_test/src/org/opencv_test/CoreTest.java
@@ -0,0 +1,25 @@
+package org.opencv_test;
+
+import org.opencv.core;
+
+
+public class CoreTest extends OpenCvTestCase {
+ public void test_1() {
+ super.test_1("CORE");
+ }
+
+ public void test_Can_Call_add() {
+ core.add(gray128, gray128, dst);
+ assertMatEqual(gray255, dst);
+ }
+
+ public void test_Can_Call_absdiff() {
+ core.absdiff(gray128, gray255, dst);
+ assertMatEqual(gray127, dst);
+ }
+
+ public void test_Can_Call_bitwise_and() {
+ core.bitwise_and(gray3, gray2, dst);
+ assertMatEqual(gray2, dst);
+ }
+}
diff --git a/modules/java/android_test/src/org/opencv_test/ImgprocTest.java b/modules/java/android_test/src/org/opencv_test/ImgprocTest.java
new file mode 100644
index 0000000000..152a78ea37
--- /dev/null
+++ b/modules/java/android_test/src/org/opencv_test/ImgprocTest.java
@@ -0,0 +1,35 @@
+package org.opencv_test;
+
+import org.opencv.Mat;
+import org.opencv.Size;
+import org.opencv.imgproc;
+
+
+public class ImgprocTest extends OpenCvTestCase {
+ public void test_1() {
+ super.test_1("IMGPROC");
+ }
+
+ //FIXME: this test crashes
+ //public void test_Can_Call_accumulate() {
+ // dst = new Mat(gray1.rows(), gray1.cols(), Mat.CvType.CV_32FC1);
+ // imgproc.accumulate(gray1, dst);
+ // assertMatEqual(gray1, dst);
+ //}
+
+ public void test_blur() {
+ Size sz = new Size(3, 3);
+
+ imgproc.blur(gray0, dst, sz);
+ assertMatEqual(gray0, dst);
+
+ imgproc.blur(gray255, dst, sz);
+ assertMatEqual(gray255, dst);
+ }
+
+ public void test_boxFilter() {
+ Size sz = new Size(3, 3);
+ imgproc.boxFilter(gray0, dst, 8, sz);
+ assertMatEqual(gray0, dst);
+ }
+}
diff --git a/modules/java/android_test/src/org/opencv_test/MatTest.java b/modules/java/android_test/src/org/opencv_test/MatTest.java
new file mode 100644
index 0000000000..dba697ffd5
--- /dev/null
+++ b/modules/java/android_test/src/org/opencv_test/MatTest.java
@@ -0,0 +1,30 @@
+package org.opencv_test;
+
+import org.opencv.Mat;
+
+
+public class MatTest extends OpenCvTestCase {
+ public void test_1() {
+ super.test_1("Mat");
+ }
+
+ public void test_Can_Create_Gray_Mat() {
+ Mat m = new Mat(1, 1, Mat.CvType.CV_8UC1);
+ assertFalse(m.empty());
+ }
+
+ public void test_Can_Create_RBG_Mat() {
+ Mat m = new Mat(1, 1, Mat.CvType.CV_8UC3);
+ assertFalse(m.empty());
+ }
+
+ public void test_Can_Get_Cols() {
+ Mat m = new Mat(10, 10, Mat.CvType.CV_8UC1);
+ assertEquals(10, m.rows());
+ }
+
+ public void test_Can_Get_Rows() {
+ Mat m = new Mat(10, 10, Mat.CvType.CV_8UC1);
+ assertEquals(10, m.rows());
+ }
+}
diff --git a/modules/java/android_test/src/org/opencv_test/OpenCvTestCase.java b/modules/java/android_test/src/org/opencv_test/OpenCvTestCase.java
new file mode 100644
index 0000000000..eacabd30f1
--- /dev/null
+++ b/modules/java/android_test/src/org/opencv_test/OpenCvTestCase.java
@@ -0,0 +1,58 @@
+package org.opencv_test;
+
+import org.opencv.Mat;
+import org.opencv.core;
+
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+
+public class OpenCvTestCase extends AndroidTestCase {
+
+ static String TAG = "OpenCV";
+
+ static Mat gray0;
+ static Mat gray1;
+ static Mat gray2;
+ static Mat gray3;
+ static Mat gray127;
+ static Mat gray128;
+ static Mat gray255;
+
+ static Mat dst;
+
+ @Override
+ protected void setUp() throws Exception {
+ //Log.e(TAG, "setUp");
+ super.setUp();
+
+ gray0 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray0.setTo(0.0);
+ gray1 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray1.setTo(1.0);
+ gray2 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray2.setTo(2.0);
+ gray3 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray3.setTo(3.0);
+ gray127 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray127.setTo(127.0);
+ gray128 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray128.setTo(128.0);
+ gray255 = new Mat(10, 10, Mat.CvType.CV_8UC1); gray255.setTo(256.0);
+
+ dst = new Mat(0, 0, Mat.CvType.CV_8UC1);
+ assertTrue(dst.empty());
+ }
+
+ public static void assertMatEqual(Mat m1, Mat m2) {
+ assertTrue(MatDifference(m1, m2) == 0.0);
+ }
+
+ static public double MatDifference(Mat m1, Mat m2) {
+ Mat cmp = new Mat(0, 0, Mat.CvType.CV_8UC1);
+ core.compare(m1, m2, cmp, core.CMP_EQ);
+ double num = 100.0 * (1.0 - Double.valueOf(core.countNonZero(cmp)) / Double.valueOf(cmp.rows() * cmp.cols()));
+
+ return num;
+ }
+
+ public void test_1(String label) {
+ Log.e(TAG, "================================================");
+ Log.e(TAG, "=============== " + label);
+ Log.e(TAG, "================================================");
+ }
+}