jni 遇到的坑--DeleteLocalRef仍然有local reference table overflow

在jni中忘记写DeleteLocalRef 导致JNI ERROR (app bug): local reference table overflow (max=512)是经常容易犯的错误。

今天这个错误又非常隐蔽:


jni错误用例:

        jstring jScene = StringFromStdString(env,(char const*) cScene);
	jclass jMsgTypeClass =  WGPlatform::GetClass("com/tencent/msdk/notice/eMSG_NOTICETYPE",env);
	jmethodID jGetMsgTypeValueMethod = env->GetMethodID(jMsgTypeClass, "val","()I");


	jclass jContentTypeClass =  WGPlatform::GetClass("com/tencent/msdk/notice/eMSG_CONTENTTYPE",env);
	jmethodID jGetContentTypeEnumMethod = env->GetStaticMethodID(jContentTypeClass, "getEnum",
			"(I)Lcom/tencent/msdk/notice/eMSG_CONTENTTYPE;");
	jmethodID jGetContentTypeValueMethod = env->GetMethodID(jContentTypeClass, "val","()I");


	jclass jPicScreenDirClass = WGPlatform::GetClass("com/tencent/msdk/notice/eMSDK_SCREENDIR",env);
	jmethodID jGetPicScreenDirEnumMethod = env->GetStaticMethodID(jPicScreenDirClass, "getEnum",
			"(I)Lcom/tencent/msdk/notice/eMSDK_SCREENDIR;");
	jmethodID jGetPicScreenDirValueMethod = env->GetMethodID(jPicScreenDirClass, "val","()I");
	jclass jVectorClass =  WGPlatform::GetClass("java/util/Vector",env);
	jmethodID jVectorInitMethod = env->GetMethodID(jVectorClass, "<init>", "()V");
	jmethodID jVectorSizeMethod = env->GetMethodID(jVectorClass, "size", "()I");
	jmethodID jVectorGetMethod = env->GetMethodID(jVectorClass, "get", "(I)Ljava/lang/Object;");
        jobject jNoticeVectorObj = env->NewObject(jVectorClass, jVectorInitMethod);
        jobject jNoticeVectorObj = env->CallStaticObjectMethod(s_WGPlatformClass,jWGGetNoticeMethod,jScene);
        env->DeleteLocalRef(jNoticeVectorObj);



通过打印引用表+代码排查,才发现问题

打印jni引用表方法:
static void printDumpReferenceTables(JNIEnv *env) {
jclass vm_class = WGPlatform::GetInstance()->GetClass("dalvik/system/VMDebug", env);
jmethodID dump_mid = env->GetStaticMethodID(vm_class, "dumpReferenceTables", "()V");
env->CallStaticVoidMethod(vm_class, dump_mid);
env->DeleteLocalRef(vm_class);

发现每次都多个vector,而第一次vector出现的地方,ni引用表中的位置大致相同。就是jni引用表出现了eMSDK_SCREENDIR类之后,就出现了vector类。这时,就可以定位到红色代码了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值