[译]Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化

译序:

这篇文章的内容实际是在我发现一个项目bug后寻找解决方案时找到的,当时项目原有target为8(ICS 4.0之前的2.X版本),在4.0+的S3上运行一切正常,而后target升级到14时再在S3上运行时就会出现类似如下的native crash:

05-13 14:07:13.139: E/dalvikvm(22265): JNI ERROR (app bug): attempt to use stale local reference 0x20d00001
05-13 14:07:13.139: E/dalvikvm(22265): VM aborting
05-13 14:07:13.139: A/libc(22265): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 22457 (Thread-1276)
05-13 14:07:13.239: I/DEBUG(1894): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-13 14:07:13.249: I/DEBUG(1894): Build fingerprint: ‘samsung/m0zc/m0chn:4.1.2/JZO54K/I9300ZCEMB1:user/release-keys’
05-13 14:07:13.249: I/DEBUG(1894): pid: 22265, tid: 22457, name: Thread-1276 >>> cn.android.app <<<
05-13 14:07:13.249: I/DEBUG(1894): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
05-13 14:07:13.489: I/DEBUG(1894): r0 00000000 r1 00000000 r2 deadd00d r3 00000000
05-13 14:07:13.489: I/DEBUG(1894): r4 408cb1a8 r5 0000020c r6 20d00001 r7 fffff86c
05-13 14:07:13.489: I/DEBUG(1894): r8 5ee308dc r9 00004e58 sl fffff870 fp 5ee307b8
05-13 14:07:13.489: I/DEBUG(1894): ip 00004000 sp 5ee30540 lr 400f7c95 pc 40866e50 cpsr 60000030
05-13 14:07:13.489: I/DEBUG(1894): d0 3ff000003f800000 d1 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d2 0000000000000000 d3 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d4 0000000000000000 d5 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d6 0000000000000000 d7 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d8 0000000000000000 d9 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d10 0000000000000000 d11 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d12 0000000000000000 d13 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d14 0000000000000000 d15 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d16 0000000000000000 d17 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d18 0000000000000000 d19 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d20 0000000000000000 d21 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d22 0000000000000000 d23 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d24 0000000000000000 d25 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d26 0000000000000000 d27 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d28 0000000000000000 d29 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): d30 0000000000000000 d31 0000000000000000
05-13 14:07:13.489: I/DEBUG(1894): scr 60000010
05-13 14:07:13.499: I/DEBUG(1894): backtrace:
05-13 14:07:13.499: I/DEBUG(1894): #00 pc 00045e50 /system/lib/libdvm.so (dvmAbort+75)
05-13 14:07:13.499: I/DEBUG(1894): #01 pc 00028c3c /system/lib/libdvm.so (IndirectRefTable::get(void*) const+336)
05-13 14:07:13.499: I/DEBUG(1894): #02 pc 00049eeb /system/lib/libdvm.so (dvmDecodeIndirectRef(Thread*, _jobject*)+30)
05-13 14:07:13.499: I/DEBUG(1894): #03 pc 0004ca77 /system/lib/libdvm.so
05-13 14:07:13.499: I/DEBUG(1894): #04 pc 00653480 /data/data/cn.android.app/lib/libgameapp.so (CKSoundManager::LoadBGM(char const*)+56)

05-13 14:07:13.509: I/DEBUG(1894): memory map around fault addr deadd00d:
05-13 14:07:13.509: I/DEBUG(1894): be9ae000-be9cf000 [stack]
05-13 14:07:13.509: I/DEBUG(1894): (no map for address)
05-13 14:07:13.509: I/DEBUG(1894): ffff0000-ffff1000 [vectors]
05-13 14:07:13.674: I/DEBUG(1894): !@dumpstate -k -t -z -d -o /data/log/dumpstate_app_native -m 22265

Continue reading…

cocos2d-x创建android项目后NDK编译警告被当作错误的处理方法

问题为编译cocos2d-x创建的android项目时,原生代码部分编译脚本build_native.sh触发的NDK编译警告被当作错误处理,项目实际编译生成成功了但是Eclipse不能运行!

开发环境:

Mac OSX ML 10.8.3

Android Developer Tools Build: v21.1.0-569685 (developer.android.com下载的整合ADT SDK的Eclipse)

android-ndk-r8e 64bit

cocos2d-2.1rc0-x-2.1.2-hotfix

Continue reading…

Win7 Win8的默认共享C$之类无法访问的解决方法

今天突然发现家里的两台电脑(一台Win7 64bit Ultimate,一台Win8 64bit Pro)互相之间都不能通过默认共享,如C$, D$之类进行访问了,普通UNC链接后会提示输入用户名和密码,接着输入管理员账密后只可访问一般共享,地址栏中输入默认共享地址C$后会一直提示输入账密,取消后提示无权访问!

以前在XP时代一直使用这种管理员账密配合默认共享的方式管理远程电脑的文件,很是方便!于是查了万能的互联网,找到了个应该算是比较完美的解决方法,用注册表编辑器regedit在如下位置加入如下键值:

Continue reading…

iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法

iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直接修改代码把重复的符号去掉!这样呢,要不就要求第三方库提供方该代码,要不就自己修改第三方库的库文件。第一种方法多少有点无理要求,所以还是直接用第二种方法自己解决了吧,也就是直接修改.a文件或framework里的库二进制文件:

Continue reading…

迁移域名到Go Daddy,完全脱离Dreamhost了,记录一下domain transfer的过程

之前给博客空间搬家,观察到现在来看新空间服务还是比较稳定的,于是开始搬家第二步:转移域名!
其实最开始域名是在name.com单独注册的,后来因为买了DH的空间免费送一个域名的费用,于是就将域名注册商迁到了DH。不过现在已经搬家,也就没得免费域名了,只能也transfer了,最开始看到DH上的说明是即使空间到期,只要域名没过期就依然可以在后台管理,因此最开始也没想这么快就转移域名,但是搬完空间之后,我想反正也不用了,不如就取消了DH的空间租用吧,结果一下就发现了奸商的本来面目…
Continue reading…

EDUP EP-N8513 (RTL8188CUS芯片)在Ubuntu 12.10下的wifi不能连接问题解决方法

EDUP EP-N8513这款USB微型无线网卡在我刚装上的64位Ubuntu 12.10下虽然能被系统识别出来,但是并不能正常连接无线AP,具体表现为可以看到AP列表,尝试连接后不停的询问密码,即使输入正确的密码也会反复不断的提示输入密码(据说如果把热点的密码去掉,完全Open的话还是可以连上的,但这么解决岂不是太不靠谱了)。

导致这问题的原因是系统自带的RTL8192cu驱动对这个芯片的兼容性不是非常好,所以还是得去Realtek官方拿驱动源码来现编译安装:http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=48&PFid=48&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true#RTL8192CU 下载这个linux用的7m多的zip:RTL8192xC_USB_linux_v3.4.4_4749.20121105.zip

在开工之前可以先用lshw -c network命令检查一下无线网卡是不是被识别为RTL8192cu,理论上只要被识别为这个型号的设备都可以用本文的方法解决连接问题。

Continue reading…

在Eclipse CDT项目中使用llvm-clang作为编译器并解决gdb调试不显示变量的问题

用了一段时间的Xcode做Mac OSX, iOS的开发后,深深的体会到llvm clang编译器的速度、人性!于是打算在刚换上的Ubuntu 12.10上也装一个好好研究研究。

装好Eclipse Version: 4.2.2和CDT后,先是发现toolchain里只有gcc,意识到又得去google了,好在很容易的就找到了llvm4eclipsecdt这个Eclipse插件(看下面的项目链接或者直接到Eclipse Marketplace里搜llvm clang就能找到),果断装上之后,开了个新C++项目,随便写了几句build,失败,看了一下找不到clang执行程序,猜想应该是还没装伟大的llvm clang编译器吧,打开Ubuntu软件中心一搜,嘿!还真有,这下省事了,直接装上llvm clang还有一些可选项,再回到Eclipse Build运行,ok,一切正常!可后来发现想运行一下Debug吧,却发现虽然断点可以正常下,单步运行也没什么问题,但视图里的局部变量之类的都没有任何显示,watch也不行,根本找不到symbol… Continue reading…