JNI转换接口

本文主要介绍了作者在学习和使用JNI转换Android接口过程中的经验,从完全不懂到逐步理解,详细记录了结构体信息和获取类信息的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值