我有一个本地C++函数,它作用于通过JNI(OpenCV4Android)从Java传递的cv :: Mat(opencv)对象。JNI从实际给出的函数参数中传递函数参数的不同值
这是我的函数声明:
extern "C" jboolean Java_com_test_JNIActivity_track(JNIEnv *env, jobject obj, jlong inMatGr, jlong inMatRgba, jint currFrame);
,这是我访问和打印的传递的参数代码:
extern "C" jboolean Java_com_test_JNIActivity_track(JNIEnv *env, jobject obj, jlong inMatGr, jlong inMatRgba, jint currFrame)
{
ALOG("Native: [email protected]%.8x, [email protected]%.8x", inMatRgba, inMatGr);
cv::Mat& captured_image = *(cv::Mat *)inMatRgba;
cv::Mat_<uchar>& grayscale_image = *(cv::Mat_<uchar> *)inMatGr;
...
}
Java的声明部分设置如下:
private native boolean track(long grayAddr, long rgbaAddr, int currFrameNum);
这是OnCameraFrame()方法的实现:
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();
Log.d(TAG_LOG, "Java: [email protected]" + Long.toString(mRgba.getNativeObjAddr(),16) +
", [email protected]" + Long.toString(mGray.getNativeObjAddr(),16));
track(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr(), currFrameNum++);
//Log.d(TAG_LOG, "Java: Frame(" + currFrameNum + ')');
return inputFrame.rgba();
}
但是,我从我在Java部分(Mat.getNatvieObjAddr())上设置的两个参数中获得了不同的值(当在本机函数内部时)。
这些都是值JNI接口两侧:
In Java: 1st argument = 0x405ab288, 2nd argument = 0x557ab9d8
In Native: 1st argument = 0x00000000, 2nd argument = 0x405ab288
最后一个参数是一个jint并给出了正确的值,可能这个问题有一些具有不同结构不同尺寸jlong做(该代码在armv7a处理器上运行)。
我很感激任何帮助。谢谢。
的本地函数的代码是从你的问题遗漏。 – Michael
@Michael我在访问参数的地方添加了代码片段。 – EHH