C++中调用jni是需要注意的问题

本文介绍了一个JNI编程中遇到的问题:循环创建对象导致JNI局部引用表溢出。通过分析LogCat输出信息,找到了问题根源,并给出了解决方案。

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

调用jclass native_clazz = env->GetObjectClass(object);循环多次然后不崩溃。
如下转载自:http://bbs.youkuaiyun.com/topics/380143109
LogCat输出信息如下:
=================================================================================
W/dalvikvm(1214): ReferenceTable overflow (max=512)
W/dalvikvm(1214): Last 10 entries in JNI local reference table:
W/dalvikvm(1214):   502: 0x4050bed0 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   503: 0x4050bee8 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   504: 0x4050bf00 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   505: 0x4050bf18 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   506: 0x4050bf30 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   507: 0x4050bf48 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   508: 0x4050bf60 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   509: 0x4050bf78 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   510: 0x4050bf90 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214):   511: 0x4050bfa8 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(1214): JNI local reference table summary (512 entries):
W/dalvikvm(1214):     of Ljava/lang/Class; 164B
W/dalvikvm(1214):     of Ljava/lang/Class; 212B
W/dalvikvm(1214):     of Ljava/lang/Class; 236B
W/dalvikvm(1214):     of Ljava/lang/Class; 284B
W/dalvikvm(1214):     of Ljava/lang/Class; 476B
W/dalvikvm(1214):     of Ljava/lang/Class; 572B
W/dalvikvm(1214):     of Ljava/lang/String; 28B (2 unique)
W/dalvikvm(1214):     of [Ljava/lang/String; 28B
W/dalvikvm(1214):   502 of Landroid/graphics/Point; 20B (502 unique)
W/dalvikvm(1214):     of Landroid/graphics/Point; 28B
W/dalvikvm(1214): Memory held directly by tracked refs is 12096 bytes
E/dalvikvm(1214): Failed adding to JNI local ref table (has 512 entries)
=================================================================================
错误描述:
JNI中通过java传过来的点的集合的对象创建C++点集合的对象,其中一段代码如下:
--------------------------------------------------
jclass objclass env->GetObjectClass(objPoint);

jfieldID id env->GetFieldID(objclass, ..., ...);
point.x env->GetIntField(objPoint, id);

id env->GetFieldID(objclass, ..., ...);
point.y env->GetIntField(objPoint, id);
--------------------------------------------------
这样循环可以创建251个点,但是到第252次调用上述代码的时候又出现最上面的错误。
在网上查了一下,return前加入一句:
env->DeleteLocalRef(objclass);
就是用env->DeleteLocalRef(objclass)清,循环调用的函数返回来的jobject没有及时清初,把局部引用表干满了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值