最近为了性能需求,开始搞JNI,白手起搞真心不容易。中间差点崩溃了好几次,最终总算得到一点心得。
JNI对性能的提升没有我预想中的大,对于for循环的速度提升大概在1倍左右,所以如果数量级不大的话,性能提升不会很明显
JNI编完之后,不能调试,是不是很蛋疼,不像android Java可以看出错信息。JNI crash之后,界面上表示为没有任何反应,过段时间直接退出应用,没有提示、也没有XXX已停止运行。第一次遇到真是无从下手,有没有!!!,经过对Java层的log研究发现,原来JNI crash后,cpu就直接死在那里(相当于assert,程序停止运行)。果断时间后JAVA层发现程序已挂之后(进程僵死),就强制杀死该进程。于是程序直接退出而无提示。(以上分析纯属个人分析,如有不对,敬请指正)。这时发现如果能有单步调试功能那该多好!!
百度一下 ndk单步调式 一般能搜出如下结果:
1、安装CDT插件
2、安装Sequoyah插件
3、使用插件装入JNI文件、导入JNI头文件
4、配置eclipse JNI编译环境
5、修改ndk-gdb脚本
6、运行ndk-gdb脚本,并修改生成的文件(windows需安装cygwin)
7、配置eclipse native调试环境
吓尿了,有没有!!!单步调试这么麻烦!!!麻烦不说,windows下使用ndk-gdb效率还特别低
另外,对于修改google release的ndk脚本,我一直持保留态度,安说release的脚本应该直接能用的,为什么要做修改后才能用呢?
以上步骤,我花了2~3小时搞定,仅仅为了能打个断点~~~
在机缘巧合下,我看到一篇google官方的文章“Using NDK Plugins”
令人兴奋的是,ADTr20已经支持JNI单步调试,再也不需要如上这么麻烦的步骤了
你现在需要做的只需以下2步:
1、使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件
2、在项目的Debug Configuration中选择Android Native Apllication,点击下方Debug
3、Enjoy your Debugging!
如何?是不是超简单,而且调试速度还相当快哦
ADTr20已经比较完美支持NDK开发了。可以集成ndk编译,只需在项目右键Add Native Support,就能自动生成jni文件,并部署编译环境(注意这个过程是不可逆的,手动删除jni文件后,会编译不过)。如果需要生成NDK调试文件,需要右键项目->properties->C/C++ build->Builder Setting 把默认的Build Command : ndk-build 修改成 ndk-build NDK_DEBUG=1
最后推荐一个很有用的android官方网站http://tools.android.com/ 这个网站包含大多数ADT使用方法和新版ADT的介绍,获益匪浅
关于如何使用ADT进行ndk单步调式就在http://tools.android.com/recent/usingthendkplugin
只可惜这种方法只能在ndk环境下使用,如果要对framework中的jni进行单步调试,应该就行不通了,推荐的一种方法是把它在NDK中编译调试完毕,然后将生成的so放在system/lib下
Activiyty之间传递对象有两种方法,参考了网络上的资源本文进行总结。
两种方法目的都是为了实现对象的序列化,一种是实现Parcelable接口,一种是实现Serializable接口。
一 、序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。
二、 至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
实现:
1、 Serializable 的实现,只需要继承 implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
Activity之间传递Serializable对象时,被传递的Serializable对象里面的自定义成员对象(非API中的Serializable对象)也要实现Serializable接口,否则会出现Caused by: java.io.NotSerializableException异常。从上面的代码可以看出,在Parcelable对象中是可以传递Serializable对象的,但Serializable对象里面传递的时候可不可以有Parcelable?回答是否定的,一样会产生java.io.NotSerializableException异常。
2、 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。
可以参考
http://developer.android.com/reference/android/os/Parcelable.html
http://blog.csdn.net/maylian7700/article/details/7323993
使用:
1、 Serializable
1)存储
Intent intent = new Intent(this, PersonInfo.class); intent.putExtra("PERSON_INFO", cc); startActivity(intent);2)提取
Intent intent = getIntent();
CustomeClass cc = intent.getSerializableExtra("PERSON_INFO");
2、 Parcelabel
1)存储
Intent intent = new Intent(Question1.this,Question2.class);
Bundle bundle = new Bundle();
bundle.putParcelable("question_objs", question);
intent.putExtras(bundle);
startActivity(intent);
2)提取
Intent intent = getIntent();
Question que = intent.getParcelableExtra("question_objs");
11月23日傍晚消息,据悉360方面将推出一种可替代互联网电视盒的数码产品,正式加入客厅多屏大战。此消息泄露于小米盒子暂停服务的次日,其内涵值得联想。
据消息灵通人士称,360正在与中国数字电视龙头企业同洲电子密洽,不日将推出具有互联网高清视频和电视功能的数码产品。据悉,该数码产品在形态上并非像小米盒子一样是“遥控器+电视外置盒子”的形式,很有可能是一部平板电脑底座。
该底座可以连接Android平板电脑,通过360或者第三方提供的软件将视频信号通过HDMI线输入到电视中显示。同时,该底座借助于合作方的关系,很可能与拥有互联网电视牌照的电视运营商合作,直接成为广电机顶盒的替代产品。
由于是作为另一种数码产品的配件(平板电脑底座),该底座也预示了具备互联网电视盒功能的平板电脑的存在。事实上,目前并没有进一步信息说明360的这一硬件产品,其电视解码芯片是内置于配套的平板电脑还是直接在底座中。也没有任何更为细节的配置资料。甚至不知道该产品是专用遥控器还是以手机为遥控器。
虽然没有得到确认消息,但360推出“特供平板电脑”的可能性是存在的。从硬件上说,一个功能完全的平板电脑,其计算能力和功能都优于互联网电视盒,后者能够实现的功能前者可以通过特定的软件实现。所以如果“360特供平板电脑”结合具备电视功能的同洲平板底座,不仅仅对于客厅多屏市场的是一大震撼,而且会导致国产平板电脑市场的格局发生翻天覆地的变化。
360特供手机这一系列营销活动和产品,或多或少影响了国产智能手机的市场格局,并客观上使得更多的功能手机消费者开始使用Android智能手机。
这一市场趋势带来的红利,很可能在未来不久时间落到国产Android平板电脑市场上。360届时无疑会把握这一趋势。和上次一样向更多对互联网还不是很熟悉的消费者开始接受平板电脑这种移动终端产品。
但将国产平板电脑与互联网电视盒两个大趋势结合在一起,不禁让人称赞周鸿祎的想象力和战略谋划。