2013年11月14日 星期四

Build WebM for Android on Ubuntu

 本文參考自 http://code.google.com/p/webm/ 中的 README.android
並加入一些操作細節, 以解決 build error

1. Create Android application project

2. Create <project>/jni

3. Change current directory to <project>/jni

4. git clone http://git.chromium.org/webm/bindings.git

5. git clone http://git.chromium.org/webm/libvpx.git

6. ./libvpx/configure --target=armv7-android-gcc --disable-examples -disable-neon --sdk-path=<full path to ndk>

7. Change current directory to <project>/jni/bindings/JNI

8. git clone http://git.chromium.org/webm/libwebm.git

9. Download ogg library from http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz, extract to bindings/JNI

10. cd llibogg-1.3.0 && ./configure && cd..

11. Download libvorbis from http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz

12. svn checkout http://libyuv.googlecode.com/svn/trunk libyuv-read-only

這時你的 bindings/JNI 目錄下會有以下目錄
libogg-1.3.0/
libvorbis-1.3.3/
libvpx/
libwebm/

13. Change current directory to <project>/jni

14. Create Application.mk with the data below

APP_ABI := armeabi-v7a
APP_OPTIM := release
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti


15. Create Android.mk with the data below

WORKING_DIR := $(call my-dir)
BINDINGS_DIR := $(WORKING_DIR)/bindings/JNI
include $(BINDINGS_DIR)/Android.mk


16. ndk-build -C <path to project>

大功告成, 你會在你的<project>/lib/armeabi-v7a 下看到  libvpx.so 等檔案
如何測試 build 出來的 .so 可以用呢? 在 README.android 裡也有介紹
在 MainActivity onCreate 加入以下的 code 就可以了

int[] major = new int[2];
int[] minor = new int[2];
int[] build = new int[2];
int[] revision = new int[2];
MkvMuxer.getVersion(major, minor, build, revision);
String outStr = "libwebm:" + Integer.toString(major[0]) + "." +
                        Integer.toString(minor[0]) + "." + Integer.toString(build[0]) + "." +
                        Integer.toString(revision[0]);
TextView tv = new TextView(this);tv.setText(outStr);
setContentView(tv);

Python Tkinter First Example

import tkinter as tk def on_closing():     root.destroy() class MainWindow(tk.Tk):     def __init__(self, *args, **kwargs):         tk.Tk.__...