Android: Problem passing BGRA Mat to JNI function with C++ background
Hello,
I'm currently trying to develop an android app that utilizes my desktop webcam project I've written in C++; it is basic image processing stuff with an OOP approach. So far I've managed to launch the app onto my via USB connected HTC device (without selecting a modifier; just showing the plain frame), but as soon as I select a process mode in the Menubar the application closes (or more precisely, it closes the window, but I can reenter the application again.)
It seems like it cannot access the function I need from my C++ files, at least LOGCAT prints an error that implies this assumption:
01-11 23:15:53.097: E/cv::error()(22022): OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /home/reports/ci/slave_desktop/50-SDK/opencv/modules/highgui/src/window.cpp, line 483
Theres another error immediately after the app launches:
01-11 23:15:45.630: E/OpenCV_for_Tegra(22022): Tegra Version detected: 0
I've also tried several ways to get the frame passed from java to jni, and as of now im using the getNativeObjAddr to pass a pointer to the rgba frame.
ProcessPlainFrame(mRgba.getNativeObjAddr(), mRgba.width(), mRgba.height(), mBw, mCart, mScary, mColhead);
I'm using booleans to determine which process type object shall be created. They're toggled in the onOptionsItemSelected method and then passed in the ProcessPlainFrame method, which is a native method defined in the JNI file:
JNIEXPORT void JNICALL Java_com_example_opencvandroidapp_MainActivity_ProcessPlainFrame(JNIEnv*, jobject, jlong rgba, jint width, jint height, jboolean bw_on, jboolean cart_on, jboolean scary_on, jboolean colhead_on){
Mat* pMatRgba = (Mat*)rgba; // create pointer to rgba mat that will function as input parameter
Mat plainFrame(height, width, CV_8UC3); // create a an output Mat (processedFrame)
// call C++ code
if(bw_on){
BlackWhiteSketch sketch;
sketch.processFrame(*pMatRgba, plainFrame);
}
else if(cart_on){
CartoonPainter cart;
cart.processFrame(*pMatRgba, plainFrame);
}
else if(scary_on){
ScaryFigure scary;
scary.processFrame(*pMatRgba, plainFrame);
}
else if(colhead_on){
ColorHead colhead;
colhead.processFrame(*pMatRgba, plainFrame);
}
}
The processFrame() funtion does different things (it's virtual), depending on the class. You can take a look at them in my github repository:
Sorry for the huge wall of text, but I'd greatly appreciate if anyone of you folks could take a look at it, I'm still a beginner in all of this and dont really know if my whole approach makes sense at all.
Regards