关于Android的JNI开发SO库调java接口函数注意事项

来源:互联网 发布:windows刻录光盘 编辑:程序博客网 时间:2024/06/07 06:26

一般Android的JNI开发,都是单方面的JAVA调SO库的接口,就SO库倒过来调java的比较少,就算有也只是很简单的调一下,没有什么数据量,而我们不仅是java调SO,且SO也调java,且是大数据相互调用的,因为这个,我们碰到了不少问题。

因为网上有很多都说了java调SO的了,就不多说,就说一下SO调java的注意事项吧。

最主要的三点:

1.注意双方的临时对象的内存释放,不然会引起内存溢出,因为不仅是你的java程度在跑,SO库里面的C/C++程序也在跑。

2.java提拱接口函数的类,里面的全局对象,如果用到在接口函数中,那么,都要声明静态的,不然会出现比如只能调用几次就不能再调了奇怪现象,这只是其中之一。

3.SO库这边调用java这边接口函数时,如果这个函数带有返回值,且返回值是个引用类型值,如byte[]数组等,那么,这个返回值的引用类型值,必须是静态的。不然,在不断的SO库调java这个接口的过程中,会出现莫名其妙的问题。

比如我们公司,在开发时,测试USB的不断解包与发包是否稳定。其中解包与发包,都是由SO库那边控制调用,java这边提拱接口。而在接收包的数据时,SO调用java提拱的收包接口函数,SO库这边每调一次这个接口,就能得到一个byte[]类型的数据,但由于我这边返回这个byte[]不是静态的,USB的接包与发包过程,一般就两三分钟就出现了露包。


4.如果用到Handle,如果用到new Message(),使用Message.obtain()来代替,他们的区别是,new Message(0是无论什么情况下,都会创建一个新的Message实例,但Message.obtain()不一样,是调用当前Handle中空闲的Message,如果没有,则等待。这样就不会因为不断的new Message()而不断的耗内存。这就是有些应用因为进行不断的更新界面会让手机越来越卡,如果使用Handle是不断的new Message(),那么这必定是原因之一。


5.发现一个问题,我面试了好些个Android程序员了,他们对于java基础中的对象被回收这一块,都不注重,像本人面试时出的很简单一道题,竟然都没出现能全答对的,试问:就算你能做出一个很炫的App,如果这个App因为你无时无刻都在耗内存,导致应用运行不流畅甚至用户手机也不流畅,那么,你这App能好到哪去? 这是题:

A a=new A();

B b=new B();

a=b;

第一问:如果这时系统GC进行垃圾回收,那个new A()跟new B()那么哪一个会被回收,或者都不被回收,还是全部回收?(如果选的不是new A(),那么,去好好恶补一下吧)

第二问:代码下面再加一句:b=null;这时,请问new B()在系统GC回收时,会不会被回收?(觉得会的,那么也去恶补一下吧。)





0 0
原创粉丝点击