I'm currently struggling with the Java Native Interface for Eclipse.
What I have:
With OpenCV, I detected keypoints of a frame and got back an object of type MatOfKeyPoint. (image is of type Mat)
private MatOfKeyPoint mKeypoints;
private FeatureDetector mDetector;
//(...)
mDetector = FeatureDetector.create(FeatureDetector.FAST);
mDetector.detect(image, mKeypoints);
What I want:
My mKeypoints is now of type MatOfKeyPoint. I want to pass this object to native code so I can do calculations faster. After my calculation, the native method should save its results in an object of type MatOfPoint2f
How I tried to do it:
I wrote a method
private native void getSkylinePoints(long addrMatOfKeyPoint, long addrOutputMat);
and used it like this:
getSkylinePoints(mKeypoints.getNativeObjAddr(),
mSkylinePoints.getNativeObjAddr());
(mSkylinePoints is of type MatOfPoint2f and is not null)
My c++ code then looks like this:
JNIEXPORT void JNICALL
Java_ch_ethz_arskyline_detection_FASTDetector_getSkylinePoints(JNIEnv*,
jobject, jlong addrMatOfKeyPoint, jlong addrOutputMat)
{
vector<KeyPoint>& keypoints = *(vector<KeyPoint>*)addrMatOfKeyPoint;
vector<Point2f>& output = *(vector<Point2f>*)addrOutputMat;
// without this line, it works
if (!keypoints.empty())
output.push_back (keypoints[0].pt);
}
I know that vector< KeyPoint> in c++ corresponds to MatOfKeyPoint in Java and vector< Point2f> in c++ corresponds to MatOfPoint2f in Java. I also wrote native functions that pass an object of type Mat (Mat in Java and Mat in c++) and there it works.
The error I get:
Debugging c++ code in eclipse is hard. All the LogCat tells me is:
Tag: libc Text: fatal signal 6 (SIGABRT) at 0x000358a (code=-6), thread 13757 (Thread-5023)
I think that you can't just do this
vector<KeyPoint>& keypoints = *(vector<KeyPoint>*)addrMatOfKeyPoint;
as I did with Mat objects:
Mat& background = *(Mat*)addrBackground;
Does anyone know how to do this? Thanks in advance for any help!
Isa