OpenCV on Android - Headers; No such file/directory
android, java-native-interface, opencv
Solution
Do you have a so-called "Application.mk" file in your "jni" directory? If you don't, try to create it with, for instance, the following code:
Application.mk:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8
Hope this will help.
Problem
so I am new to using the JNI for Android so sorry in advance if this is something silly. I have installed the SDK and in Eclipse have added it as a library for the project. After finishing up everything, I have tried to run the ndk-build function but get this error: ``` Compile++ thumb : face_detect_rec <= jni_part.cpp In file included from jni/face_detect_rec.h:11:0, from jni/jni_part.cpp:3: /Users/Justin/Documents/Android/opencv-2.4.3.2-android-sdk/sdk/native/jni/include/opencv2/core/core.hpp:56:21: fatal error: algorithm: No such file or directory compilation terminated. make: *** [obj/local/armeabi/objs/face_detect_rec/jni_part.o] Error 1 ``` That file location is where the core.hpp is so I am not sure why this is a problem. I'll post my code below for reference, thanks guys! jni_part.cpp: ``` #include <jni.h> #include "face_detect_rec.h" using namespace std; using namespace cv; extern "C" { JNIEXPORT void JNICALL Java_com_example_opencvandroidtest_MainActivity_detectFaces( JNIEnv* env, jclass mClass, jstring filePath) { detectFaces(filePath); } } ``` face_detect_rec.h ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/contrib/contrib.hpp> #include <iostream> #include <fstream> #include <sstream> #include <string> using namespace cv; using namespace std; static void detectFaces(string filePath); ``` face_detect_rec.cpp: ``` #include "face_detect_rec.h" // Create a string that contains the exact cascade name string faceCascade_name = "/Users/Justin/Documents/OpenCV/data/haarcascades/haarcascade_frontalface_alt2.xml"; /* "haarcascade_profileface.xml";*/ string eyeCascade_name = "/Users/Justin/Documents/OpenCV/data/haarcascades/haarcascade_mcs_lefteye.xml"; //string rightEyeCascade_name = // "/Users/Justin/Documents/OpenCV/data/haarcascades/haarcascade_mcs_righteye.xml"; // Function to detect and draw any faces that is present in an image static void detectFaces(string filePath) { // Create a new Haar classifier CascadeClassifier faceCascade; Mat img = imread(filePath); //int scale = 1; // Load the HaarClassifierCascade faceCascade.load(faceCascade_name); // Check whether the cascade has loaded successfully. Else report and error and quit if( faceCascade.empty() ) { cout << "ERROR: Could not load classifier cascade\n"; return; } // There can be more than one face in an image. So create a growable sequence of faces. // Detect the objects and store them in the sequence vector<Rect> faces; faceCascade.detectMultiScale(img, faces, 1.1, 2, CV_HAAR_SCALE_IMAGE, cvSize(70, 70)); // Loop the number of faces found. for( int i=0; i<faces.size(); i++ ) { //save image Mat faceROI = img(faces[i]); stringstream s; s << "/mnt/sdcard/Pictures/TagSense" << i << ".jpg"; imwrite(s.str(), faceROI); } } } ```