先介绍一下背景吧。
JNI调用C语言的时候, 碰到一个比较蛋疼的问题, 就是在回调函数中调用DetachCurrentThread这个, 会异常退出。
然后就是各种加打印, 终于定位到是调用DetachCurrentThread过程中由SetByteArrayRegion这个函数引起ArrayIndexoutofBoundsException。
又是各种试, 终于知道为啥会退出了, 不过不知道更深层次的原因。
在回调函数中, 由于会经常调用(1秒会有十几次调用), 而且会申请一块大内存(3M), 我为了节省资源, 让开始的时候, 一次性申请, 然后每次都SetByteArrayRegion这个函数去存放数据。 等到DetachCurrentThread这个时候, 就杯具了。
解决方案很简单, 就是每次调用回调的时候, 都用NewByteArray能申请一块空间。
如果谁有更好的解决方案,请告诉我, 谢谢!
本文讨论了在JNI调用C语言时遇到的ArrayIndexOutOfBoundsException问题,特别是在回调函数中使用DetachCurrentThread和SetByteArrayRegion函数导致的问题。通过分析发现,一次性申请大量内存并在多次调用中使用SetByteArrayRegion会导致此错误。提出的解决方案是在每次调用回调函数时重新申请内存空间。
638

被折叠的 条评论
为什么被折叠?



