Java から JNI (OpenCV4Android) を介して渡された cv::Mat (opencv) オブジェクトに作用するネイティブ C++ 関数があります。
これは私の関数宣言です:
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: Rgba@%.8x, Gray@%.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: Rgba@0x" + Long.toString(mRgba.getNativeObjAddr(),16) +
", Gray@0x" + Long.toString(mGray.getNativeObjAddr(),16));
track(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr(), currFrameNum++);
//Log.d(TAG_LOG, "Java: Frame(" + currFrameNum + ')');
return inputFrame.rgba();
}
ただし、Java 部分 (Mat.getNatvieObjAddr()) で設定したものから 2 つの引数に対して (ネイティブ関数内の場合) 異なる値を取得します。
これらは、JNI インターフェイスの両側の値です。
In Java: 1st argument = 0x405ab288, 2nd argument = 0x557ab9d8
In Native: 1st argument = 0x00000000, 2nd argument = 0x405ab288
最後の引数は jint であり、正しい値を与えます。この問題は、さまざまなアーキテクチャでさまざまなサイズの jlong に関係している可能性があります (コードは armv7a プロセッサで実行されます)。
助けていただければ幸いです。ありがとう。