这两天又遇到一些jni的问题。首先是java的测试程序会随机的当掉。这个问题后来发现是因为我们的native method的实现里为了效率,缓存了一些java对象(主要是jclass,java类的句柄),但是忘记把他们设成global reference了,这样jvm在进行垃圾回收的时候,就把这些对象释放了,所以后面的native method里面对这些对象的访问当然就死掉了。
这个问题的解决还是比较顺利,但是另外一个问题的解决就没哪么清楚了。
具体是这样的,我们的native method里面构建了一个java的对象,是一个图像的缩略图,返回的对象里面有三个字段:width, height和imageBitmapData。然后java的应用程序负责根据这些数据,构造一个BufferedImage。一般情况是一个循环,里面不断这么做,处理一堆缩略图。结果发现到一定数量,就死了。
这个问题后来查了半天,也没头绪。后来我把java程序重新换个方法实现了,就ok了,现在也不知道到底是怎么回事。我猜也许还是jni的local/global reference这种东西没处理好,结果垃圾回收让程序找不到北了。我的重新实现只是导致jvm的垃圾回收没哪么奏效了而已。
总之,涉及jni,总还是有点小小麻烦的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/67063/viewspace-450399/
,如需转载,请注明出处,否则将追究法律责任。