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


原文地址:https://www.cnblogs.com/wishchin/p/9200107.html