• 安卓JNI使用C++类


           安卓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++对象的数据成员进行更新,并取成员值,完成第本地对象的使用。


  • 相关阅读:
    拆分跨天的时间数据
    模板
    更换数据库服务器迁移步骤
    缺失索引
    flex布局解说和属性
    Vuejs中关于computed、methods、watch,mounted的区别
    皮囊
    回家
    江苏旅游计划
    重写原生alert,弹出层过一会就消失
  • 原文地址:https://www.cnblogs.com/wishchin/p/9200107.html
Copyright © 2020-2023  润新知