编译自己的Android NDK工具链

Android提供的NDK工具链是基于GCC 4.4.3的,很多最新的GCC的优化特性无法使用,于是尝试自己编译一个。下面描述下具体过程。

获取需要的文件

按照下面的列表下载相同版本的源码,只要到它们的官方网站就可以找到

  • NDKr7
  • binutils 2.21.1
  • GCC 4.6.2
  • GDB 7.3.1
  • GMP 5.0.2
  • MPC 0.9
  • MPFR 3.0.1

当然可以选择尝试不同的版本组合,但可能会有各种错误,浪费宝贵的时间,比如下面这个错误我就困扰了很久

/bin/sed: can't read =/tmp/ndk-abitno/build/toolchain/temp-install/lib/libgmp.la: No such file or directory
libtool: link: `=/tmp/ndk-abitno/build/toolchain/temp-install/lib/libgmp.la' is not a valid libtool

READ MORE>>

开发者注册Android Market收取费用

发现很多朋友并不知道如何把Android Market上赚的刀给收回来,这边来分享下是如何不受任何限制的从Android Market把费用都收到自己的银行帐户。

首先自然是花$25注册一个普通的Android Developer,这里要注意的是一定要把国家选择成香港,什么美国台湾中国的都不可行。另外,信用卡的选择似乎没什么太大关系,试过招商银行和北京银行的Visa和MasterCard信用卡均能迅速通过。

接下来,Google会对上面的注册进行一个初步的审核,很快可以通过,就可以在Android Developer后台https://market.android.com/publish/Home提交并发布应用了。

此时此刻,只能发布免费的应用。同时可以看到Developer后台页面下方有一个验证Merchant Account的链接,果断点它,我们被带到了Checkout的设置页面,如实的输入自己的信息即可。其中电话我是用的大陆的联通手机号,以+86打头,地址我写的香港大学的地址,应该可以随便写一个,估计也没人审查。

当填写好上面的信息之后,回到Android Developer后台,Google会提示你正在审核商户信息,很快,一般不会超过一晚上就可以通过的。通过后会看到提示可以Sell Apps了。

好的,Google这边告一段落,下面是银行方面的准备工作,主要任务就是申请一张香港的借记卡。不清楚其他银行的情况,我是申请的招商银行的香港一卡通,下面是具体流程。

有情提示,这部分最好是能同步的跟上面的注册一起进行,这样会节省不少时间。

READ MORE>>

Android 3.x无法收到Broadcast小问题

昨天刚刚收到了第一台Android平板设备——Galaxy tab 10.1,第一次全面的在Android 3.x上调试各种代码。

第一组程序就遇到了问题,这组APP的工作是通过Broadcast来协作的,当一个APP启动时,它会sendBroadcast来告诉其他应用,在Android 2.3.x和之前的版本一直工作正常,到3.1上这些BroadcastReceiver就开始淡定的不行,不论我怎么大声广播都没反应TOT

又是没日没夜的调试,想过了各种的可能,还是不成。最后又是Google这个麻烦的制造者帮我找到了这么一组讨论,问题自然就明了了:从Android 3.1开始,为了安全考虑,任何刚刚安装的程序都不会主动运行,除非用户启动过一次。

讨论中给出的解决方案对我的情况还是不靠谱,毕竟这组应用都没有Launcher Activity,都是在收到特定的Broadcast时才开始工作的。不过知道了问题所在,解决的办法就有了。

for (App a : apps) {
    Intent i = new Itent("ACTION_NAME");
    i.setComponentName(a.packageName, a.receiverClassName);
    sendBroadcast(i);
}

虽然很简单的就能解决我的问题,不过折腾的过程是惨不忍睹的,一直到凌晨2、3点才睡觉。这么重大的一个改变,Google也不写一下,至少要在javadoc里写清楚吧。我也想知道问题的答案:What is a good Android reference for changes like this?

READ MORE>>

Android NDK可用的FFmpeg源码

首先为自己的错误郑重的道歉,第一个错误是声明为”free forever“的VPlayer最后成了收费的了,第二个是没有及时的公布用到的FFmpeg源码。错了就是错了,没有什么值得为自己辩解的,得让实际行动证明一切。

VPlayer使用了FFmpeg的代码,基于LGPLv3协议,修改过的代码可以点击这里下载。

下载之后使用非常简单,FFmpeg的代码没做任何修改,不需要configure,编译过程使用的是其中的Android标准编译文件Android.mk。只要把代码放到一个标准的Android工程中的jni目录下,运行ndk-build即可。

之前写过一篇用Android NDK编译FFmpeg,写的过于繁琐,一直承诺会更新一个简单易用的方法,现在算是兑现了。

从那之后,这个博客也很少更新了,其实不只这里,我的Twitter等帐号也算是废弃了,基本上都是在开发VPlayer这个播放器,期间有很多学习和成功的快乐,也有各种纠结的事情,幸好有大家的支持,更幸运的是有星星陪我。

顺便说一下,随着Android NDKr5的发布,一切都变的简单起来,只要你会普通Linux上的编译流程,你应该也会用它。我也不介绍这种了,因为我没试过,只简单的看了下更新日志里有提到。

依然不停的思考 AND 编码,为了美好明天。。。

READ MORE>>

发布一Android全能播放器

又一个Android播放器而已,调用了FFmpeg的LGPL代码,所以各种视频封装和编码格式基本都支持,测试过avi mkv rmvb mp4 wmv ogv没有问题。

使用Milestone(CPU 600MHz,RAM 256M,Andriod 2.1)能流畅播放360P高码率视频,480P低码率也基本可以播放,不过要在降低画质的前提下。

先发张截图看看吧,这是一360P的RMVB视频,效果还不错,整个过程声画同步正常,也一直处于比较流畅的状态,画质基本没受影响。
vplayer-final-fantasy.png

READ MORE>>

在Android NDK中使用libffmpeg.so

前面一篇文章介绍了如何在Android NDK中编译FFmpeg,发现感兴趣的朋友很是多吗,而且大家似乎总不成功。

于是我把编译好的so文件发上来,请点击此处下载。注意,这个文件是针对NEON优化编译的,在不支持NEON的ARM处理器上可能无法运行。

似乎很久没写过东西了,下面就介绍下大体的使用方法,希望有点帮助。

首先你要有一个Android项目,把libffmpeg.so放到项目的libs/armeabi-v7a/中。然后要准备FFmpeg的源文件,把它们放到你喜欢的目录,比如jni/ffmpeg/中。

编辑你需要使用libffmpeg.so的项目模块的Android.mk,在合适的位置添加如下内容

LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)
LOCAL_LDLIBS += -L$(PATH_TO_LIBFFMPEG_SO) -lffmpeg

变量PATH_TO_FFMPEG_SOURCE代表FFmpeg源码的路径,PATH_TO_LIBFFMPEG_SO是到libffmpeg.so的路径。

说明一下,这个so只包含avformat,avcodec和avutil三部分,另外我也把其中的log方法改成了Android适用的。

一切OK,然后你就可以自由的使用FFmpeg了。

READ MORE>>

用Android NDK编译FFmpeg

Android内置的编解码器实在太少,于是我们需要FFmpeg。Android提供了NDK,为我们使用FFmpeg这种C语言代码提供了方便。

不过为了用NDK编译FFmpeg,还真的花费了不少时间,也得到了很多人的帮助,最应该谢谢havlenapetr。我觉得我现在这些方法算是比较简洁的了--

下面就尽量詳細的说一下我是怎么在项目中使用FFmpeg的,但是基于我混乱的表达能力,有不明白的就问我。

你得了解JNI和Android NDK的基本用法,若觉得我的文章还不错,可以看之前写的JNI简单入门Android NDK入门


首先创建一个标准的Android项目vPlayer

android create project -n vPlayer -t 8 -p vPlayer -k me.abitno.vplayer -a PlayerView

然后在vPlayer目录里

mkdir jni && cd jni
wget http://ffmpeg.org/releases/ffmpeg-0.6.tar.bz2
tar xf ffmpeg-0.6.tar.bz2 && mv ffmpeg-0.6 ffmpeg && cd ffmpeg

READ MORE>>