安卓JNI使用C++类

来源:互联网 发布:mac炒股软件 知乎 编辑:程序博客网 时间:2024/06/05 05:09

       安卓JNI使用C++类,同时可使用C++的类成员变量,这就必须保证程序持续保存Native状态,即长期维护C++对象的地址。完成初始化之后,需要使用对象成员的java层函数需要传入对象的地址。

    

一、Native类-对象的初始化


1. 一个Java类的数据成员

    private FeelJulyGpsMap  mNativeDetector;//分类器声明!用于标识使用C++对象地址    //摄像机参数:用于缩放!    CamParam                   mCamParam =null;    //JNI2.用于识别的JNI代码!      private long mNativeObj = 0;    //用于追踪测试!    public long mNativeObjCvT = 0;

2. 使用的Native库

//JNI1.使用JNI的C++库static {System.loadLibrary("feelJulyGpsMap");}

3.使用的JNI函数:

//2.JNI函数!//四、追踪函数-OpenCV!wishchin!!!private static native long trackInitJni(String cascadeName);

4.Java初始化函数

//1.主要处理函数!public int trackInit(){mCamParam = new CamParam();//初始化摄像机参数!wishchin!!!String cascadeName ="";mNativeObjCvT   = trackInitJni(cascadeName);//长期维持mNativeObjCvT 值,作为对象的地址return 1;}

5.java使用的函数

       mTrack6Dof = new CTrack6Dof();       if(null!= mTrack6Dof){              mTrack6Dof.trackInit();//初始化参数!参数对象全局变量已封装!        }

上述过程完成native对象的初始化,java层长期保持 mNativeObjCvT 的值作为JNI层的传入地址。


二、Native类-对象成员的使用


1. 在java层,可以传入地址使用C++层的对象的数据和函数

    @SuppressLint("SdCardPath")    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {        mRgba = inputFrame.rgba();        mGray = inputFrame.gray();        //0.检测面部的原始代码!//Detect 面部的代码,使用C++!wishchin!        //detectFace( mGray, mRgba);                //JNI//wishchin !        if (mTrack6Dof.mNativeObjCvT != 0 && mTrack6Dof.mCamParam!=null){        //1.测试追踪!                 mTrack6Dof.trackOneFrame( M );//trackInit();       }


2. 所使用的JNI接口函数的函数

//主要处理函数,追踪一帧图像!@SuppressLint("SdCardPath")public  int trackOneFrame( Mat frame ){Mat frameRf= frame.clone();Mat rvec = new Mat();rvec =Mat.zeros(3,1,CvType.CV_64FC1);Mat tvec = new Mat();tvec =Mat.zeros(3,1,CvType.CV_64FC1);jniTrackProject(mNativeObjCvT,frame.getNativeObjAddr(),mCamParam.intrinsic_Mat.getNativeObjAddr(),mCamParam.disCoeff.getNativeObjAddr(),mCamParam.object_pointsM.getNativeObjAddr() ,(mCamParam.axisM).getNativeObjAddr(),frameRf.getNativeObjAddr() ,rvec.getNativeObjAddr(),tvec.getNativeObjAddr());      }

所使用的 mNativeObjCvT, 值为对象的C++层地址。


3. trackProject()的函数原型:

//取代trackJniRf的输出,多输出几个参数!//把画图的投影点带出JNI层!private static native int jniTrackProject(long thiz,long frame,long intrinsic_Mat, long disCoeff, long object_pointsM , long axisM ,long frameRf,long rvec,long  tvec //The next Input! The Draw OutPut!);

使用 long thiz, 这个参数代表对象的地址参数输入....

上述过程完成对本地C++对象的数据成员进行更新,并取成员值,完成第本地对象的使用。


0 0
原创粉丝点击