最近在写JNI转换Android接口,我是完全不懂,照着别人的套路写,现在总结一下
结构体信息入下:
struct PICTURECFG
{
BYTE byUseType;
BASEMAP_CFG struBasemapCfg;
BYTE[NAME_LEN] sPicName;
int dwVideoWallNo;
};
struct BASEMAP_CFG
{
BYTE byScreenIndex;
int wSourWidth;
};
转换函数:
JNIEXPORT jint JNICALL Java_com_netsdk_HCNetSDK_NET_1DVR_1PicUpload
(JNIEnv *env, jobject obj, jint lUserID, jstring sFileName, jobject oPictureCfg)
{
if(oPictureCfg == NULL)
{
return -1;
}
if(!env->IsInstanceOf(oPictureCfg,env->FindClass("com/hikvision/netsdk/PICTURECFG")))
{
return -1;
}
jclass cPictureCfg = env->GetObjectClass(oPictureCfg);
jfieldID idbyUseType = env->GetFieldID(cPictureCfg,"byUseType","B");
jfieldID idstruBasemapCfg = env->GetFieldID(cPictureCfg,"struBasemapCfg","[Lcom/netsdk/BASEMAP_CFG;");
jfieldID idsPicName = env->GetFieldID(cPictureCfg,"sPicName","[B");
jfieldID iddwVideoWallNo = env->GetFieldID(cPictureCfg,"dwVideoWallNo","I");
PICTURECFG struPicCfg = {0};
struPicCfg.byUseType = env->GetByteField(oPictureCfg,idbyUseType);
jbyteArray arrPicName = (jbyteArray)env->GetObjectField(oPictureCfg,idsPicName);
env->GetByteArrayRegion(arrPicName,0,NAME_LEN,(jbyte*)struPicCfg.sPicName);
struPicCfg.dwVideoWall = env->GetIntField(oPictureCfg,iddwVideoWallNo);
jobject oBasemapCfg = env->GetObjectField(oPictureCfg,idstruBasemapCfg);
jclass cBasemapCfg = env->GetObjectClass(oBasemapCfg);
jfieldID idbyScreenIndex = env->GetFieldID(cBasemapCfg,"byScreenIndex","B");
jfieldID idwSourWidth = env->GetFieldID(cBasemapCfg,"wSourWidth","I");
struPicCfg.struBasemapCfg.byScreenIndex = env->GetByteField(oBasemapCfg,idbyScreenIndex);
struPicCfg.struBasemapCfg.wSourWidth = env->GetIntField(oBasemapCfg,idwSourWidth);
const char *strFileName = env->GetStringUTFChars(sFileName, 0);
return PicUpload(lUserID,strFileName,&struPicCfg);
}
1.首先判断类oPictureCfg是否为空,java里面是否定义了这个类
if(oPictureCfg == NULL)
{
return -1;
}
if(!env->IsInstanceOf(oPictureCfg,env->FindClass("com/hikvision/netsdk/PICTURECFG")))
{
return -1;
}
2.获取类信息
jclass cPictureCfg = env->GetObjectClass(oPictureCfg);
3.获取id信息(类的成员变量的id)
jfieldID idbyUseType = env->GetFieldID(cPictureCfg,"byUseType","B");
如果里面还有类的成员变量
jfieldID idstruBasemapCfg = env->GetFieldID(cPictureCfg,"struBasemapCfg","[Lcom/netsdk/BASEMAP_CFG;");
4.定义结构体并获取值
PICTURECFG struPicCfg = {0};
struPicCfg.byUseType = env->GetByteField(oPictureCfg,idbyUseType);
如有数组
jbyteArray arrPicName = (jbyteArray)env->GetObjectField(oPictureCfg,idsPicName);
env->GetByteArrayRegion(arrPicName,0,NAME_LEN,(jbyte*)struPicCfg.sPicName);
里面的类,在递归,获取object,获取class,获取id,获取值
jobject oBasemapCfg = env->GetObjectField(oPictureCfg,idstruBasemapCfg);
jclass cBasemapCfg = env->GetObjectClass(oBasemapCfg);
jfieldID idbyScreenIndex = env->GetFieldID(cBasemapCfg,"byScreenIndex","B");
jfieldID idwSourWidth = env->GetFieldID(cBasemapCfg,"wSourWidth","I");
struPicCfg.struBasemapCfg.byScreenIndex = env->GetByteField(oBasemapCfg,idbyScreenIndex);
struPicCfg.struBasemapCfg.wSourWidth = env->GetIntField(oBasemapCfg,idwSourWidth);
string转换为char*
const char *strFileName = env->GetStringUTFChars(sFileName, 0);
5.调用C++的函数
return PicUpload(lUserID,strFileName,&struPicCfg);