这几天在搞基于位置的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. webpack命令

    webpack // 执行一次开发的编译 webpack -p // 针对发布环境编译(压缩代码) webpack -w(或--watch) // 进行开发过程持续的增量编译(飞快地!) webpac ...

  2. xtrabackup安装使用说明

    软件介绍: Percona XtraBackup是一块开源且免费的对MySQL Innodb存储引擎备份数据的工具,使用此工具的时候不需停止MySQL,而且支持压缩备份,支持对Innodb存储引擎做增 ...

  3. bzoj 2435 dfs处理

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...

  4. .bat 批处理

    最简单的一个批处理文件 @echo off echo 这是测试内容1 echo 这是测试内容2 pause 输出: 这是测试内容1 这是测试内容2 请按任意键继续. . .

  5. 一个node.js图片上传显示小应用

    文件结构如下: 实现的功能有: 可以通过浏览器使用. 当请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 用户可以选择一个图片并提交表单,随后文件将被上 ...

  6. javaScript 笔记(6) --- jQuery(下)

    目录 --- jQuery HTML --- jQuery 遍历 --- jQuery Ajax jQuery HTML: jQuery 捕获:三个简单实用的用于 DOM 操作的 jQuery 方法: ...

  7. Access数据库访问类 帮助类

    原文发布时间为:2009-10-28 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Data.OleDb; p ...

  8. css sticky footer 布局 手机端

    什么是css sticky footer 布局? 通常在手机端写页面 会遇到如下情况 页面长度很短不足以撑起一屏,此时希望页脚在页面的底部 而当页面超过一屏时候,页脚会在文章的底部 ,网上有许多办法, ...

  9. sgu 275 To xor or not to xor 线性基 最大异或和

    题目链接 题意 给定\(n\)个数,取其中的一个子集,使得异或和最大,求该最大的异或和. 思路 先求得线性基. 则求原\(n\)个数的所有子集的最大异或和便可转化成求其线性基的子集的最大异或和. 因为 ...

  10. 【程序打包工具 Inno Setup】转

    原文转自 https://jingyan.baidu.com/article/36d6ed1f50ecfc1bcf4883aa.html