这几天在搞基于位置的AR应用,採用了github上两款开源项目:

mixare

android-argument-reality-framework

这两个项目实现机制大致同样。我选取的是android-argument-reality-framework。原因是我觉得他的代码结构要清晰非常多(纯属个人意见)。

这两个项目的demo在执行时都会crash,通过查看控制台,能够看到例如以下信息:

07-31 14:35:38.685: W/dalvikvm(13686): ReferenceTable overflow (max=1024)
07-31 14:35:38.685: W/dalvikvm(13686): JNI pinned array reference table (0x5fc810) dump:
07-31 14:35:38.685: W/dalvikvm(13686): Last 10 entries (of 1024):
07-31 14:35:38.685: W/dalvikvm(13686): 1023: 0x4130ada8 char[] (29 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1022: 0x4130a768 char[] (29 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1021: 0x413ad8d0 char[] (29 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1020: 0x413aa990 char[] (36 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1019: 0x40ea2eb0 char[] (5 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1018: 0x40e262d8 char[] (5 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1017: 0x40ee8000 char[] (4 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1016: 0x40e97418 char[] (4 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1015: 0x413a9e38 char[] (22 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 1014: 0x413a9858 char[] (33 elements)
07-31 14:35:38.685: W/dalvikvm(13686): Summary:
07-31 14:35:38.685: W/dalvikvm(13686): 1 of byte[] (128 elements)
07-31 14:35:38.685: W/dalvikvm(13686): 50 of char[] (4 elements) (2 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 50 of char[] (5 elements) (2 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 25 of char[] (22 elements) (25 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (23 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (24 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (25 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (27 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (28 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 508 of char[] (29 elements) (508 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (31 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 49 of char[] (33 elements) (49 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 25 of char[] (34 elements) (25 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 50 of char[] (36 elements) (50 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 25 of char[] (37 elements) (25 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 49 of char[] (39 elements) (49 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (44 elements) (24 unique instances)
07-31 14:35:38.685: W/dalvikvm(13686): 24 of char[] (63 elements) (24 unique instances)
07-31 14:35:38.685: E/dalvikvm(13686): Failed adding to JNI pinned array ref table (1024 entries)
07-31 14:35:38.685: I/dalvikvm(13686): "main" prio=5 tid=1 RUNNABLE
07-31 14:35:38.685: I/dalvikvm(13686): | group="main" sCount=0 dsCount=0 obj=0x40a59460 self=0x343830
07-31 14:35:38.685: I/dalvikvm(13686): | sysTid=13686 nice=0 sched=0/0 cgrp=default handle=1074517384
07-31 14:35:38.685: I/dalvikvm(13686): | schedstat=( 23316582697 3886607959 27513 ) utm=2194 stm=137 core=0
07-31 14:35:38.685: I/dalvikvm(13686): at android.graphics.Paint.native_measureText(Native Method)
07-31 14:35:38.685: I/dalvikvm(13686): at android.graphics.Paint.measureText(Paint.java:1288)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.lib.gui.PaintScreen.getTextWidth(PaintScreen.java:153)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.lib.gui.TextObj.prepTxt(TextObj.java:107)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.lib.gui.TextObj.<init>(TextObj.java:65)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.lib.gui.TextObj.<init>(TextObj.java:50)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.marker.ImageMarker.drawTitle(ImageMarker.java:135)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.marker.ImageMarker.draw(ImageMarker.java:120)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.DataView.draw(DataView.java:252)
07-31 14:35:38.685: I/dalvikvm(13686): at org.mixare.AugmentedView.onDraw(MixView.java:1411)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.View.draw(View.java:10978)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.ViewGroup.drawChild(ViewGroup.java:2887)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
07-31 14:35:38.685: I/dalvikvm(13686): at android.view.View.draw(View.java:10981)
07-31 14:35:38.685: I/dalvikvm(13686): at android.widget.FrameLayout.draw(FrameLayout.java:450)
07-31 14:35:38.685: I/dalvikvm(13686): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2126)
07-31 14:35:38.690: I/dalvikvm(13686): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026)
07-31 14:35:38.690: I/dalvikvm(13686): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
07-31 14:35:38.690: I/dalvikvm(13686): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
07-31 14:35:38.690: I/dalvikvm(13686): at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 14:35:38.690: I/dalvikvm(13686): at android.os.Looper.loop(Looper.java:137)
07-31 14:35:38.690: I/dalvikvm(13686): at android.app.ActivityThread.main(ActivityThread.java:4575)
07-31 14:35:38.690: I/dalvikvm(13686): at java.lang.reflect.Method.invokeNative(Native Method)
07-31 14:35:38.690: I/dalvikvm(13686): at java.lang.reflect.Method.invoke(Method.java:511)
07-31 14:35:38.690: I/dalvikvm(13686): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-31 14:35:38.690: I/dalvikvm(13686): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-31 14:35:38.690: I/dalvikvm(13686): at dalvik.system.NativeStart.main(Native Method)
07-31 14:35:38.690: E/dalvikvm(13686): VM aborting

通过

id=145">https://code.google.com/p/mixare/issues/detail?id=145

id=36908">https://code.google.com/p/android/issues/detail?id=36908大致了解到了原因就是在频繁调用native_measureText可能出现了内存泄露,可是始终没有好的解决方式。

最后经过一番折腾,最终在

id=22">https://code.google.com/p/android-augment-reality-framework/issues/detail?

id=22里找到的解决的,给出的解决方式例如以下:

http://stackoverflow.com/questions/16813706/android-apps-activity-force-back

改动android-augment-reality-framework项目的src/com/jwetherell/augmented_reality/ui/objects/PaintableObject.java中的getTextWidth方法为例如以下代码就可以:

/**
* Get the width of the text String.
*
* @param txt
* CharSequence to get the width of.
* @param start
* Start of the text.
* @param end
* End of the text.
* @return float width of the text String.
* @throws NullPointerException
* if the String param is NULL.
*/
public float getTextWidth(CharSequence text) {
if (text == null)
throw new NullPointerException(); TextPaint textPaint = new TextPaint(paint);
int widthWrap = 1000; // you may have to change this
StaticLayout layout = measure(textPaint, text, widthWrap);
return getMaxLineWidth(layout);
} private float getMaxLineWidth(StaticLayout layout) {
float maxLine = 0.0f;
int lineCount = layout.getLineCount();
for (int i = 0; i < lineCount; i++) {
if (layout.getLineWidth(0) > maxLine) {
maxLine = layout.getLineWidth(0);
}
}
return maxLine;
} private StaticLayout measure(TextPaint textPaint, CharSequence text,
Integer wrapWidth) {
int boundedWidth = Integer.MAX_VALUE;
if (wrapWidth != null && wrapWidth > 0) {
boundedWidth = wrapWidth;
}
StaticLayout layout = new StaticLayout(text, textPaint, boundedWidth,
Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
return layout;
}

mixare的measureText方法在频繁调用时抛出“referencetable overflow max 1024”的解决方式的更多相关文章

  1. Redis出现多线程调用时抛出 [B cannot be cast to java.lang.Long] 异常

    原因分析: 多个线程同时调用了同一个jedis对象,导致内存数据被多个线程竞争,产生数据混乱 (或者大家都用通一个redis获取同一个实例,登录同一个账号使用缓存时报错) 解决方案:每个线程都new出 ...

  2. 浅析调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException

    废话不多说,直接进入正题:如何使用JSR303的validate,进行数据校验,失败后直接抛出异常加入流转信息中,并在form页面提示出来. 首先我们为了启用验证,需要向 项目中添加Bean验证的实现 ...

  3. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

  4. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  5. 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法

    原文:[VS调试]C#读写Windows 7注册表时抛出"不允许所请求的注册表访问权"的解决办法 项目 - 属性 - 安全性,"使用ClickOnce",修改a ...

  6. JMS之——ActiveMQ时抛出的错误Could not connect to broker URL-使用线程池解决高并发连接

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/69046395 解决使用activemq时抛出的异常:javax.j ms.JMSE ...

  7. AES加密时抛出java.security.InvalidKeyException: Illegal key size or def

    原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...

  8. PHP 安装 扩展时 抛出 /usr/local/Cellar/php@7.1/7.1.25/pecl 异常解决

    liugx@MacBook-Pro  ~/work/php/ext_source/php-xhprof-extension   master  make installmkdir: /usr/ ...

  9. List 调用 remove 方法时抛出 java.lang.UnsupportedOperationException 异常原因

    原因 使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作.       Arrays.asList(arr) 返回的类型是 Aarrays$Arr ...

随机推荐

  1. EPEL 安装源

    EPEL 安装源 EPEL 是 Extra Packages for Enterprise Linux 的缩写(EPEL),是用于 Fedora-based Red Hat Enterprise Li ...

  2. BZOJ3720 Gty的妹子树 【树分块】

    题目 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每个妹子有一个美丽度 ...

  3. 【HDOJ5533】Dancing Stars on Me(计算几何)

    题意:给定二维平面上的n个整点,问它们是否都在正n边形的定点上 n<=100,abs(x[i]),abs(y[i])<=1e4 思路:队友做的,抱大腿 可以发现只有n=4时顶点有可能都是整 ...

  4. Java中Collections的sort方法和Comparable与Comparator的比较

    一.Comparable 新建Student1类,类实现Comparable接口,并重写compareTo方法 public class Student1 implements Comparable& ...

  5. c#中使用事务

    原文发布时间为:2009-04-14 -- 来源于本人的百度文章 [由搬家工具导入] 问:为什么要用事务? 答:事务保证要么一组操作执行成功,要么全不执行。。。。 /// <summary> ...

  6. 在Android 7.0以上PopupWindow.showAsDropDown()不起作用问题

    最近优化界面,调用PopupWindow.showAsDropDown()发现,窗口并没有在控件下方显示. 有网友说是7.0以上系统的问题,可以自定义PopupWindow,重写showAsDropD ...

  7. JSP-Servlet-SpringMVC

    作者:码思客链接:https://zhuanlan.zhihu.com/p/37612412来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇文章,我们来讲讲技术,系 ...

  8. python 设计模式之命令模式

    命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...

  9. 洛谷 P3359 改造异或树

    题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...

  10. Java 在Word创建表格

    表格作为一种可视化交流模式及组织整理数据的手段,在各种场合及文档中应用广泛.常见的表格可包含文字.图片等元素,我们操作表格时可以插入图片.写入文字及格式化表格样式等.下面,将通过Java编程在Word ...