C++ JNI 常用函数自查表

文章目录

          • 结构体对齐
          • 结构体数据读取
          • 字符串转换
          • 字符串拷贝
            • byte short 数组互转
            • char 转 Jstring
            • 申请和释放Jni对象
            • 写文件

结构体对齐

使用1字节对齐 避免出现空位读数据错误

#pragma pack(1)
typedef struct ParseFrameData {short FrameHead;unsigned short Width;unsigned short Height;unsigned char SN[14];unsigned char Security;unsigned int systemState = 0;BC backgroundCheckList[50];unsigned short HumanCheckCount;HC humanCheckList[10];
} PFD;
#pragma pack()
//引入
#include //声明
pthread_mutex_t mutex;//初始化互斥量
if (0 != pthread_mutex_init(&mutex, NULL)) {LOGE("--init native mutex fail--");
}
LOGI("--init native mutex succ--");//加锁
pthread_mutex_lock(&mutex);//释放锁
pthread_mutex_unlock(&mutex);//销毁互斥量
if (0 != pthread_mutex_destroy(&mutex)) {LOGE("--destroy native mutex fail--");
}
LOGI("--destroy native mutex succ--");
结构体数据读取
typedef  struct DATA_HEAD {int usHeadLength;//文件头长度short            sTMin;//最小测量温度short            sTMax;//最大测量温度unsigned short   usWidth;//图像宽unsigned short   usHeight;//图像高
}DH;volatile DH mDH;extern "C"
JNIEXPORT void JNICALL
Java_com_guide_guidecore_jni_NativeGuideCore_guideCoreRealTimeHeaderInit(JNIEnv *env, jobject thiz,jbyteArray header) {if (header == NULL) {return;}pthread_mutex_lock(&mutex);jbyte *headerArray = env->GetByteArrayElements(header, JNI_FALSE);memcpy((void *) &mDH, headerArray, sizeof(mDH));env->ReleaseByteArrayElements(header, headerArray, 0);pthread_mutex_unlock(&mutex);LOGE("mDH.usHeadLength = %d", mDH.usHeadLength);LOGE("mDH.sTMin = %d", mDH.sTMin);LOGE("mDH.sTMax = %d", mDH.sTMax);LOGE("mDH.usHeight = %d", mDH.usHeight);LOGE("mDH.usWidth = %d", mDH.usWidth);
} 
字符串转换

char* Common::toLower(const char* str) {int length = strlen(str);char* result = new char[length + 1];int temp;int offset = 'a' - 'A';for (int i = 0; i < length; i++) {temp = str[i];if (temp >= 'A' && temp <= 'Z'){result[i] = temp + offset;}else {result[i] = temp;}}result[length] = '\0';return result;
}char* Common::toUpper(const char* str) {int length = strlen(str);char* result = new char[length + 1];int temp;int offset = 'a' - 'A';for (int i = 0; i < length; i++) {temp = str[i];if (temp >= 'a' && temp <= 'z'){result[i] = temp - offset;}else{result[i] = temp;}}result[length] = '\0';return result;
}BYTE* Common::UshortToHex(UINT16 value)
{BYTE* result = new BYTE[2];result[0] = (value >> 8) & 0xFF;result[1] = value & 0xFF;return result;
}UINT16 Common::HexToUshort(BYTE* value)
{unsigned short result = value[0] << 8;return result + value[1];
}BYTE* Common::UintToHex(UINT32 value)
{BYTE* result = new BYTE[4];result[0] = (value >> 24) & 0xFF;result[1] = (value >> 16) & 0xFF;result[2] = (value >> 8) & 0xFF;result[3] = value & 0xFF;return result;
}UINT32 Common::HexToUint(BYTE* value)
{unsigned int result1 = value[0] << 24;unsigned int result2 = value[1] << 16;unsigned int result3 = value[2] << 8;return result1 + result2 + result3 + value[3];
}
字符串拷贝
char* deepCopy(const char* str, int from, int size) {char* tempfullname = new char[size + 1];memcpy(tempfullname, str + from, size);tempfullname[size] = '\0';return tempfullname;
}
byte short 数组互转
void convertByteArr2ShortArr(signed char *src, int srcLen, short *dst) {memcpy(dst, src, (size_t) (srcLen));
}void convertShortArr2ByteArr(short *src, int srcLen, signed char *dst) {memcpy(dst, src, (size_t) (srcLen * 2));
}
char 转 Jstring

jstring chartoJstring(JNIEnv *env, char *pat, int length) {jclass strClass = env->FindClass("java/lang/String");jmethodID ctorID = env->GetMethodID(strClass, "","([BLjava/lang/String;)V");int realLength = length;for (int i = 0; i < length; i++) {if (pat[i] == 0) {realLength = i;break;}}jbyteArray bytes = env->NewByteArray(realLength);env->SetByteArrayRegion(bytes, 0, realLength, (jbyte *) pat);jstring encoding = env->NewStringUTF("utf-8");jstring result = (jstring) env->NewObject(strClass, ctorID, bytes, encoding);// memory releaseenv->DeleteLocalRef(strClass);env->DeleteLocalRef(bytes);env->DeleteLocalRef(encoding);return result;
}

Jstring 转 char


//jstring to char*
char* jstringTochar(JNIEnv* env, jstring jstr, jint limitCount) {char* rtn = NULL;if(jstr == NULL){rtn = (char*) malloc(limitCount);memset(rtn, 0, limitCount);return rtn;}jclass clsstring = env->FindClass("java/lang/String");jstring strencode = env->NewStringUTF("utf-8");jmethodID mid = env->GetMethodID(clsstring, "getBytes","(Ljava/lang/String;)[B");jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);jsize alen = env->GetArrayLength(barr);jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);if (alen > 0) {rtn = (char*) malloc(limitCount);memset(rtn, 0, limitCount);if (alen + 1 > limitCount) {memcpy(rtn, ba, limitCount - 1);rtn[limitCount - 1] = 0;} else {memcpy(rtn, ba, alen);rtn[alen] = 0;}}env->ReleaseByteArrayElements(barr, ba, 0);env->DeleteLocalRef(clsstring);env->DeleteLocalRef(strencode);env->DeleteLocalRef(barr);return rtn;
}
申请和释放Jni对象

AS现在会自动生成

	jbyte *jY8Array = env->GetByteArrayElements(jy8Arr, JNI_FALSE);jshort *y16Array = env->GetShortArrayElements(jY16Arr, JNI_FALSE);env->ReleaseByteArrayElements(jy8Arr, jY8Array, 0);env->ReleaseByteArrayElements(jY16Arr, y16Array , 0);
写文件
	u_char *rgba = NULL;if (rgba == NULL) {rgba = new u_char[ylength];memset(rgba, 0, ylength);}//char *filename = "/storage/emulated/0/Meidi/pYData.raw";//FILE *file = fopen(filename, "wb");//打开文件存储编码完成数据//if (NULL != file) {//	fwrite(pInfo->pYData, 1, ylength, file);//	fclose(file);//}	FILE *fileY16;fileY16 = fopen("/sdcard/testY16.raw", "wb");if(fileY16 == NULL) {LOGD("tempArray:open y16 file failed");}fwrite(y16Array, sizeof(short), w * h, fileY16);fclose(fileY16);if (NULL != rgba) {delete[]rgba;rgba = NULL;}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部