12 月 2014

Android Studio中项目NDK原生部分整合方式

UPDATE 2016.11.14:
目前的新版Android Studio 2.2已经可以完美支持NDK原生代码整合,通过cmake以及lldb实现c/c++代码调试,并且支持代码补全等功能!

自从Android Studio出现以后,我就很少再使用Eclipse+ADT的组合做Android开发了,更快的反应速度和更人性化的操作方式以及智能感知方面等等的优势,确实体现出了Google最初宣传Android Studio时的大部分特点,不过这些种种优势目前还只是体现在Java应用开发部分,而对于需要用到C/C++的Android NDK开发时,目前还没有很好的支持,当然,参考目前Android Studio的版本迭代速度来看,这应该也只是时间问题,当初ADT刚出的时候也是问题多多,包括后来的CDT+NDK支持,最初也只是支持原生代码的编译生成so,过了很久很久的某次update才加入了原生代码的可视化调试功能(当时也是历尽万难才测试成功的,还只是很简单的混合ndk项目…)。

最近看到了ndk又更新到了r10b版本,而且又据说新版的Android Studio中已经加入了一些ndk支持,于是正好一次测试一下(Android Studio beta 0.8.14, android-ndk32-r10b-windows-x86_64):

Continue reading…

再次优化博客的加载速度,这次是gravatar!

上次发现的拖慢源头是wordpress加载的google fonts,这两天又发现博客页面在打开时一直有高延迟的操作导致浏览器loading转啊转,虽然不想之前的那个在超时之前完全显示不出页面吧,但看着也挺烦人的,用chrome的开发者工具看了下发现是wordpress默认的gravatar头像无法加载,直接开了一下http连接,果然是又被B了…

试了几个function里加filter替换gravatar头像链接到镜像服务器的方法未果,于是到插件库里搜了一下,果然找到了个“谷歌字体与Gravatar头像加速”(http://www.igeeklab.com/),装上后发现自己的gravatar头像可以正常的、快速的显示出来了!不过duoshuo中没有设置过头像的用户默认gravatar头像还是没有转向到镜像地址,看了下多说论坛,发现也有反馈这个问题的,11月份官方人员的回复是正在准备替换头像方案,好吧,就先不管了。

既然谷歌字体也有加速,那么就关掉了之前的”Remove Google Fonts References”。

另外发现post页面内还会有一个zemanta.com的loader.js会超时,看了下原来是一个related posts的插件用到的,无奈删掉后替换了另一个相关文章的插件。

Android NDK中多线程JNI的local reference释放问题

首先声明这个问题是在Android系统中进行JNI调用时发现的,不确定是标准Java行为还是Android的特例,非Android系统仅供参考!

之前在做NDK开发时,自然少不了JNI的Java->C/C++以及C/C++->Java的互相调用过程,如一些常见的GetStringUTFChars,GetObjectClass等等,对VM的Java对象引用计数也略有一些概念,像GetStringUTFChars需要ReleaseStringUTFChars,DeleteLocalRef释放局部引用计数等,不过大部分情况下,没有DeleteLocalRef也没出什么太大的问题,这次在试验NDK的C+11支持时用到了std::thread和lambda表达式创建了native线程,如下:

workerThread = std::thread([this]()
{
    g_pVM->AttachCurrentThread(&mJNIEnv, NULL);
    ...
    g_pVM->DetachCurrentThread();
}
);

并在线程中进行了Java方法的调用,传递了一些字符串,结果没跑几个循环进程就crash掉了,看了下logcat提示的错误是:

JNI ERROR (app bug): local reference table overflow (max=512)

并打印出了最后200个local reference table中的东西,看了下有传的String有get到的Java class,于是想到了释放引用的问题,不过JNI调用的代码都是copy过来以前写的,也没出现过类似的问题,很是奇怪。

Continue reading…