1. 程式人生 > >JNI 資料傳輸的一個例子

JNI 資料傳輸的一個例子

#include "Config.h"
#include "Format.h"

#define LOG_TAG "CADTrack_Jni"
#include "Log.h"

#include <jni.h>
#include <android/log.h>

#include "stdio_fl.h"
#include "stdlib_fl.h"
#include "string_fl.h"
#include "memory_fl.h"
#include "AndroidHelper.h"

#include "CadInterface.h"

#ifndef CLASSNAME
#error CLASSNAME was not define, please define CLASSNAME first like -DCLASSNAME=com_alvasystems_CADTrack
#endif

#define JNIFUNC_NOTUSE2(CLZ, FUN) JNIEXPORT JNICALL Java_##CLZ##_##FUN
#define JNIFUNC_NOTUSE1(CLZ, FUN) JNIFUNC_NOTUSE2(CLZ, FUN)
#define JNIFUNC(FUNCNAME) JNIFUNC_NOTUSE1(CLASSNAME, FUNCNAME)

extern "C" {
    /**
	 * @brief 初始化Cad
	 * @param width: 影象的寬
	 * @param height: 影象的高
	 * @param format: 影象的格式
	 * @return: 控制代碼,用於後面所有函式的輸入
	 */
    jlong JNIFUNC(CadInit)(JNIEnv* env, jobject obj, jint iwidth, jint iheight, jint format) {
        
        void* cadInfo = CadInit(iwidth, iheight, format);
		intptr_t ptr = (intptr_t)cadInfo;
        return (jlong)ptr;
    }
	/**
	* @brief 加入模板資料
	* @param ptrCad: CadInit的返回值
	* @param modelPath: 模型路徑
	* @param ftFlag: 0代表從Android的Asset檔案(僅限Android平臺) 1代表 儲存器中的檔案
	* @return: 返回一個合適的值,相機到模板的值,這個值使物體在螢幕上有合適的大小
	*/
    jfloat JNIFUNC(CadLoadModel)(JNIEnv* env, jobject obj, jlong cadInfo, jstring dxfModelPath, jint ftFlag) {
        char* cadmodelpath = Jstring2CStr(dxfModelPath);
        float ret = 0;
		char * objPtr = NULL;
		int objLength = 0;
        ret = CadLoadModel((void *)cadInfo, cadmodelpath, ftFlag, &objLength);
        return ret;
    }
	/**
	* @brief 傳入初始的位姿
	* @param ptrCad: CadInit的返回值
	* @param Rx: x方向的旋轉角度,單位是度
	* @param Ry: y方向的旋轉角度,單位是度
	* @param Rz: z方向的旋轉角度,單位是度
	* @param Tx: x方向的平移
	* @param Tx: y方向的平移
	* @param Tx: z方向的平移
	* @return: 0成功
	*/
    jint JNIFUNC(CadSetInitRT)(JNIEnv* env, jobject obj, jlong cadInfo, jfloat xAngle, jfloat yAngle, jfloat zAngle, jfloat xTrans, jfloat yTrans, jfloat zTrans) {
        int ret = 0;
        ret = CadSetInitRT((void *)cadInfo, xAngle, yAngle, zAngle, xTrans, yTrans, zTrans);
        return ret;
    }
	/**
	* @brief 釋放整個控制代碼
	* @param ptrCad: CadInit的返回值
	* @return: 0成功
	*/
    jint JNIFUNC(CadUnit)(JNIEnv* env, jobject obj, jlong cadInfo) {
        return CadUnit((void *)cadInfo);
    }
	/**
	* @brief 釋放載入的模型
	* @param ptrCad: CadInit的返回值
	* @return: 0成功
	*/
    jint JNIFUNC(CadUnloadCadModel)(JNIEnv* env, jobject obj, jlong cadInfo) {
        return CadUnloadCadModel((void *)cadInfo);
    }
	/**
	* @brief 獲取三角面片的數量
	* @param ptrCad: CadInit的返回值
	* @return: 返回三角面片的數量
	*/
	jint JNIFUNC(CadGetModelFaceNum)(JNIEnv* env, jobject obj, jlong cadInfo) {
        return CadGetModelFaceNum((void *)cadInfo);
    }
	/**
	* @brief 獲取所有三角面片的數值
	* @param ptrCad: CadInit的返回值
	* @param model3dFace: 外部開空間,位元組大小為(CadGetModelFaceNum的返回值)* 3 * 3 * sizeof(float) 三角面片的值,第一個三角面的值x0,y0,z0,x1,y1,z1,x2,y2,z2 如此依次排列
	* @return: 返回三角面片的數量
	*/	
	jint JNIFUNC(CadGetModelFaceData)(JNIEnv* env, jobject obj, jlong cadInfo, jfloatArray model3dFace) {
        
		int numFace = CadGetModelFaceNum((void *)cadInfo);
		float * cModel3dFace = NULL;
		if (model3dFace)
            cModel3dFace = (float*)env->GetFloatArrayElements(model3dFace, 0);
		
		
		
		  if (cModel3dFace)
            env->ReleaseFloatArrayElements(model3dFace, (jfloat*)cModel3dFace, JNI_COMMIT );
		
		return 0;
    }
	
	/**
	* @brief 獲取模型線條的個數
	* @param ptrCad: CadInit的返回值
	* @return: 0成功
	*/
    jint JNIFUNC(CadGetModelLineNum)(JNIEnv* env, jobject obj, jlong cadInfo) {
        return CadGetModelLineNum((void *)cadInfo);
    }
	
	
	/**
	* @brief 獲取模型線條的資料
	* @param ptrCad: CadInit的返回值
	* @return: float *型別的地址 如:第一個線的兩個端點 x0,y0,z0,x1,y1,z1如此依次排列
	*/
    jint JNIFUNC(CadGetModelLine)(JNIEnv* env, jobject obj, jlong cadInfo, jfloatArray ThreeDimsCoords) {
        float* cThreeDimsCoords = NULL;
        int ret = 0;
        if (ThreeDimsCoords)
            cThreeDimsCoords = (float*)env->GetFloatArrayElements(ThreeDimsCoords, 0);
        int lineNum = CadGetModelLineNum((void *)cadInfo);
        CadGetModelLine((void *)cadInfo, cThreeDimsCoords);

        if (cThreeDimsCoords)
            env->ReleaseFloatArrayElements(ThreeDimsCoords, (jfloat*)cThreeDimsCoords, JNI_COMMIT );
	 
        return ret;
    }

	/**
	* @brief 獲取狀態,識別還是跟蹤
	* @param ptrCad: CadInit的返回值
	* @return: 0代表識別,1代表跟蹤
	*/
    jint JNIFUNC(CadGetStatus)(JNIEnv* env, jobject obj, jlong cadInfo) {
        return CadGetStatus((void *)cadInfo);
    }
	
	/**
	* @brief 獲取RTS矩陣和線可見否的標誌位,如果想在一個地方同時獲取兩個結果就可以不用分別呼叫下面
	* 兩個函式,如果TRS和Flag在不同的位置用,那麼TRS= NULL, Flag=NULL,之後再呼叫CadGetRTS(),和CadGetModelLineFlag()
	* @param ptrCad: CadInit的返回值
	* @param TRS 返回一個float[16]的陣列,4*4矩陣,記憶體橫向儲存
	* @param Flag: 一個int型別陣列,外部開空間,1代表可見,0代表不可見
	* @return: 0
	*/	
	jint JNIFUNC(CadUpdataResult)(JNIEnv* env, jobject obj, jlong cadInfo, jfloatArray TRS, jintArray Flag) {
    
		CadUpdataResult((void *) cadInfo);
		return 0;
    }
	
	/**
	* @brief 獲取RTS矩陣
	* @param ptrCad: CadInit的返回值
	* @return: 返回一個float[16]的陣列,4*4矩陣,記憶體橫向儲存
	*/
    jint JNIFUNC(CadGetRTS)(JNIEnv* env, jobject obj, jlong cadInfo, jfloatArray rtsMatrix) {
        int ret = 0;
        float* crts = NULL;
        if (rtsMatrix)
            crts = env->GetFloatArrayElements(rtsMatrix, 0);
        ret = CadGetRTS((void *)cadInfo, crts);
        if (crts)
            env->ReleaseFloatArrayElements(rtsMatrix, (jfloat*)crts, JNI_COMMIT );//JNI_ABORT
        return ret;
    }

	/**
	* @brief 獲取三維線條是否可見
	* @param ptrCad: CadInit的返回值
	* @param Flag: 一個int型別陣列,外部開空間,1代表可見,0代表不可見
	* @return: 返回 0成功
	*/	
	jint JNIFUNC(CadGetModelLineFlag)(JNIEnv* env, jobject obj, jlong cadInfo, jintArray Flag) {
        int ret = 0;
        int* cFlag = NULL;
        if (Flag)
            cFlag = env->GetIntArrayElements(Flag, 0);
        ret = CadGetModelLineFlag((void *)cadInfo, cFlag);
        if (cFlag)
            env->ReleaseIntArrayElements(Flag, (jint*)cFlag, JNI_ABORT);
        return ret;
    }
	/**
	* @brief 獲取所有三角面片的數值
	* @param ptrCad: CadInit的返回值
	* @param fov:  相機的夾角
	* @param nearDis:  相機的近平面
	* @param farDis:  相機的遠平面
	* @return: 返回三角面片的數量
	*/	
	jint JNIFUNC(CadSetFovNearFar)(JNIEnv* env, jobject obj, jlong cadInfo, jfloat fov, jfloat nearDis, jfloat farDis) {
        int ret = 0;
        ret = CadSetFovNearFar((void *)cadInfo, fov, nearDis, farDis);
        return ret;
    }
	
	
	
}