安卓JNI使用C++类
生活随笔
收集整理的這篇文章主要介紹了
安卓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接口函數的函數
所使用的 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++對象的數據成員進行更新,并取成員值,完成第本地對象的使用。
總結
以上是生活随笔為你收集整理的安卓JNI使用C++类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国十大信托公司?
- 下一篇: 建行转账手续费 建行转账手续费怎么算