公司最近在做一个项目,基于全志A20系统,属于android低端机
在工业应用当中,经常会使用到io流输出输入。读取开发板上面高低电频
在这里会使用到jni
大家知道,c语言跟java体系不同,jni调用的c语言出错,java层是无法捕获出错信息,也无法消除错误
假设是纯c语言,直接调用exit(0)函数,然后自启,整个过程不会超过0.1秒,但在android中,c语言出错,是不会抛出错误的。
所以网上很多碰到相同问题,如软件跑一段时间突然提示Could not lock surface,然后软件处于假死状态,碰一下就死。但我没见到过真正解决的方案
于是我花了很久时间,通过绝大耐心的调试,找到了我代码内部造成Could not lock surface并且不报任何其他错误的bug。分享给大家,希望对您有帮助
在我的工程中,我需要调用c语言中ioctl这个函数。这个函数的含义我就不在这说了,网上一大把。当我高频率延迟约200毫秒使用该函数,直至某次,
使用该函数之前需要使用的open函数返回值超过1024;该函数会返回错误值-1,logcat马上输出Could not lock surface;程序立即假死。
当然,并非是c函数使用频率导致的问题,而是我的代码架构问题,我在另一个地方写了一个网络connect函数,并且在connect失败时未关闭描述符也就是也就是没有调用close方法。导致描述符被占用而自增
,自增到1024以上,程序即崩溃。
正确的做法是统一管理描述符,将描述符写成静态变量,凡是使用了描述符的地方,先行判断是否大于0,大于则直接close掉。
修改软件过后,再未出现该问题。
表达不清,忘请见谅,总之,出现could not lock surface问题,并且未报java错误,最佳的方法,请检查jni里面c语言是否规范,并调试一下。