JNI参考表溢出 [英] Jni Reference Table overflow

查看:135
本文介绍了JNI参考表溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Andr​​oid应用程序,我大量使用返回一些数据的本地方法的。

若干呼叫不过之后我得到一个崩溃。

本机调用的方法是:

 静态jbyteArray JNIGetIcon(JNIEnv的* E,JCLASS clazz所)
{
    ByteBuffer的BUFF;
    buff.Write(*图标,48,32,r66Api :: IBitmap :: TEncoding :: EEnc_Rgba8888);

    jbyteArray结果= GETENV() - > NewByteArray(buff.Size());
    GETENV() - > SetByteArrayRegion(结果,0,buff.Size(),(jbyte *)buff.GetData());

    返回结果;
}
 

有人能指出我什么,我做错了什么?

崩溃日志是:

  02-10 18:33:32.075 W / dalvikvm(10644 * 10644):ReferenceTable溢出(最大值= 1024)
02-10 18:33:32.075 W / dalvikvm(10644 * 10644):在JNI固定数组引用表中最后10个条目:
02-10 18:33:32.075 W / dalvikvm(10644 * 10644):1014:0x2fc77de0 CLS = [C(28字节)
02-10 18:33:32.075 W / dalvikvm(10644 * 10644):1015:0x2fc79b88 CLS = [C(28字节)
02-10 18:33:32.075 W / dalvikvm(10644 * 10644):1016:0x2fc79c38 CLS = [C(28字节)
02-10 18:33:32.085 W / dalvikvm(10644 * 10644):1017:0x2fc79ef8 CLS = [C(28字节)
02-10 18:33:32.085 W / dalvikvm(10644 * 10644):1018:0x2fc79fa8 CLS = [C(28字节)
02-10 18:33:32.085 W / dalvikvm(10644 * 10644):1019:0x2fc7a050 CLS = [C(28字节)
02-10 18:33:32.085 W / dalvikvm(10644 * 10644):1020:0x2fc7a0f0 CLS = [C(28字节)
02-10 18:33:32.105 W / dalvikvm(10644 * 10644):1021:0x2fc7a190 CLS = [C(28字节)
02-10 18:33:32.105 W / dalvikvm(10644 * 10644):1022:0x2fc7a240 CLS = [C(28字节)
02-10 18:33:32.105 W / dalvikvm(10644 * 10644):1023:0x2fc7a2e8 CLS = [C(28字节)
02-10 18:33:32.115 W / dalvikvm(10644 * 10644):JNI固定阵列参考表摘要(1024项):
02-10 18:33:32.115 W / dalvikvm(10644 * 10644):6 [C 20B(5唯一)
02-10 18:33:32.115 W / dalvikvm(10644 * 10644):1013 [C 28B(237独有)
02-10 18:33:32.125 W / dalvikvm(10644 * 10644):2 [C 36B(2唯一的)
[C 52B的1:02-10 18:33:32.125 W / dalvikvm(10644 * 10644)
[C 68B的1:02-10 18:33:32.125 W / dalvikvm(10644 * 10644)
[C 92B的1:02-10 18:33:32.125 W / dalvikvm(10644 * 10644)
02-10 18:33:32.125 W / dalvikvm(10644 * 10644):直接通过本地code的保持内存是7020字节
02-10 18:33:32.135 E / dalvikvm(10644 * 10644):无法加入到JNI固定数组引用表(1024项)
02-10 18:33:32.135的I / dalvikvm(10644 * 10644):主要的PRIO = 5 TID = 3 RUNNABLE
02-10 18:33:32.135的I / dalvikvm(10644 * 10644):|组=主SCOUNT = 0 dsCount = 0 S = N的obj = 0x2aaca308自我= 0xbe08
02-10 18:33:32.135的I / dalvikvm(10644 * 10644):| sysTid = 10644漂亮= 0 sched的= 0/0 CGRP =未知手柄= 1877224116
02-10 18:33:32.135的I / dalvikvm(10644 * 10644):在android.graphics.Canvas.drawText(本机方法)
02-10 18:33:32.145的I / dalvikvm(10644 * 10644):在android.text.BoringLayout.draw(BoringLayout.java:363)
02-10 18:33:32.145的I / dalvikvm(10644 * 10644):在android.widget.TextView.onDraw(TextView.java:4052)
02-10 18:33:32.155的I / dalvikvm(10644 * 10644):在android.view.View.draw(View.java:6535)
02-10 18:33:32.155的I / dalvikvm(10644 * 10644):在android.view.ViewGroup.drawChild(ViewGroup.java:1531)
02-10 18:33:32.155的I / dalvikvm(10644 * 10644):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
02-10 18:33:32.165的I / dalvikvm(10644 * 10644):在android.view.View.draw(View.java:6538)
02-10 18:33:32.165的I / dalvikvm(10644 * 10644):在android.view.View.buildDrawingCache(View.java:6297)
02-10 18:33:32.165的I / dalvikvm(10644 * 10644):在android.view.View.getDrawingCache(View.java:6086)
02-10 18:33:32.165的I / dalvikvm(10644 * 10644):在android.view.ViewGroup.drawChild(ViewGroup.java:1456)
02-10 18:33:32.175的I / dalvikvm(10644 * 10644):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 

解决方案

我觉得你找错功能。根据日志消息,你有一大堆固定的字符数组(以下简称[C)。其中1013是准确的。

查找一个GetStringChars或GetStringCritical调用没有匹配的版本。

In my android application I make extensive use of a native method that returns some data.

However after a number of calls I obtain a crash.

The native called method is :

static jbyteArray JNIGetIcon(JNIEnv* e, jclass clazz)
{
    ByteBuffer buff;
    buff.Write(*icon, 48, 32, r66Api::IBitmap::TEncoding::EEnc_Rgba8888);

    jbyteArray result = GetEnv()->NewByteArray(buff.Size());
    GetEnv()->SetByteArrayRegion(result, 0, buff.Size(), (jbyte*)  buff.GetData());

    return result;     
}

Could someone point me to what I'm doing wrong ?

the crash log is:

02-10 18:33:32.075 W/dalvikvm(10644*10644): ReferenceTable overflow (max=1024)
02-10 18:33:32.075 W/dalvikvm(10644*10644): Last 10 entries in JNI pinned array reference table:
02-10 18:33:32.075 W/dalvikvm(10644*10644): 1014: 0x2fc77de0 cls=[C (28 bytes)
02-10 18:33:32.075 W/dalvikvm(10644*10644): 1015: 0x2fc79b88 cls=[C (28 bytes)
02-10 18:33:32.075 W/dalvikvm(10644*10644): 1016: 0x2fc79c38 cls=[C (28 bytes)
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1017: 0x2fc79ef8 cls=[C (28 bytes)
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1018: 0x2fc79fa8 cls=[C (28 bytes)
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1019: 0x2fc7a050 cls=[C (28 bytes)
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1020: 0x2fc7a0f0 cls=[C (28 bytes)
02-10 18:33:32.105 W/dalvikvm(10644*10644): 1021: 0x2fc7a190 cls=[C (28 bytes)
02-10 18:33:32.105 W/dalvikvm(10644*10644): 1022: 0x2fc7a240 cls=[C (28 bytes)
02-10 18:33:32.105 W/dalvikvm(10644*10644): 1023: 0x2fc7a2e8 cls=[C (28 bytes)
02-10 18:33:32.115 W/dalvikvm(10644*10644): JNI pinned array reference table summary (1024 entries):
02-10 18:33:32.115 W/dalvikvm(10644*10644): 6 of [C 20B (5 unique)
02-10 18:33:32.115 W/dalvikvm(10644*10644): 1013 of [C 28B (237 unique)
02-10 18:33:32.125 W/dalvikvm(10644*10644): 2 of [C 36B (2 unique)
02-10 18:33:32.125 W/dalvikvm(10644*10644): 1 of [C 52B
02-10 18:33:32.125 W/dalvikvm(10644*10644): 1 of [C 68B
02-10 18:33:32.125 W/dalvikvm(10644*10644): 1 of [C 92B
02-10 18:33:32.125 W/dalvikvm(10644*10644): Memory held directly by native code is 7020 bytes
02-10 18:33:32.135 E/dalvikvm(10644*10644): Failed adding to JNI pinned array ref table (1024 entries)
02-10 18:33:32.135 I/dalvikvm(10644*10644): "main" prio=5 tid=3 RUNNABLE
02-10 18:33:32.135 I/dalvikvm(10644*10644): | group="main" sCount=0 dsCount=0 s=N obj=0x2aaca308 self=0xbe08
02-10 18:33:32.135 I/dalvikvm(10644*10644): | sysTid=10644 nice=0 sched=0/0 cgrp=unknown handle=1877224116
02-10 18:33:32.135 I/dalvikvm(10644*10644): at android.graphics.Canvas.drawText(Native Method)
02-10 18:33:32.145 I/dalvikvm(10644*10644): at android.text.BoringLayout.draw(BoringLayout.java:363)
02-10 18:33:32.145 I/dalvikvm(10644*10644): at android.widget.TextView.onDraw(TextView.java:4052)
02-10 18:33:32.155 I/dalvikvm(10644*10644): at android.view.View.draw(View.java:6535)
02-10 18:33:32.155 I/dalvikvm(10644*10644): at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
02-10 18:33:32.155 I/dalvikvm(10644*10644): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.View.draw(View.java:6538)
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.View.buildDrawingCache(View.java:6297)
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.View.getDrawingCache(View.java:6086)
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.ViewGroup.drawChild(ViewGroup.java:1456)
02-10 18:33:32.175 I/dalvikvm(10644*10644): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)

解决方案

I think you're looking at the wrong function. According to the log message you've got a whole bunch of pinned character arrays (the "[C"). 1013 of them to be exact.

Look for a GetStringChars or GetStringCritical call that doesn't have a matching Release.

这篇关于JNI参考表溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆