Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

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 app 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, 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:

Github Link

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

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 app 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, 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:

Github Link

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

click to hide/show revision 3
forgot to mention something

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, 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:

Github Link

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