JNI 資料傳輸的一個例子
阿新 • • 發佈:2018-12-16
#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; } }