about 7 years ago

1. Download NDK


2. Download ffmpeg source code


3. Modify configure file


  • 開啓 $NDK/sources/ffmpeg/configure,找到下列內容

    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    
  • 原本的組態內容會將編譯出的檔案,在附檔名後再加上版本資訊(e.g. libavcodec.a.55),Android 系統並不支援這種格式,所以我們用下列內容替代。

    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    

4.Build ffmpeg


  • 新增 $NDK/sources/ffmpeg/build_android.sh,輸入以下內容。

    #!/bin/bash
    NDK=$HOME/Desktop/adt/android-ndk-r9
    SYSROOT=$NDK/platforms/android-9/arch-arm/
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
    function build_one
    {
    ./configure \
        --prefix=$PREFIX \
        --disable-shared \
        --enable-static \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --target-os=linux \
        --arch=arm \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
    }
    CPU=arm
    PREFIX=$(pwd)/android/$CPU 
    ADDI_CFLAGS="-marm"
    build_one
    
  • 我們取消了shared object,打開 static library,編譯出的檔案會是 .a 檔,這邊的設定可依需求自行調整。

  • 修改 build_android.sh 檔案屬性

    sudo chmod +x build_android.sh
    
  • 執行

    ./build_android.sh
    

    編譯成功後,檔案會放在 $NDK/sources/ffmpeg/android/arm。

6. Use ffmpeg in Android project


  • 在 project 目錄下,新增 jni 目錄。

  • 複製 header files。將 $NDK/sources/ffmpeg/android/arm/include 資料夾複製到 $project/jni/。

  • 複製 library(.a files)。將 $NDK/sources/ffmpeg/android/arm/lib 目錄下的所有 .a 檔,複製到 $project/jni/。

  • 新增 $project/jni/android.mk,並輸入以下內容。

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := mytest
    LOCAL_SRC_FILES := mytest.c
    
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
    LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -lavformat -lavcodec -lavfilter -lswresample -lavutil -lswscale -llog -ljnigraphics -lz -ldl -lgcc
    
    include $(BUILD_SHARED_LIBRARY)
    

7. Build


  • 開啓 terminal

  • cd 到 project 根目錄下,目錄下應該要有 jni 子目錄。

  • build

    ndk-build clean
    ndk-build
    
 
over 7 years ago

ERROR : Can't connect to local MySQL server through socket '/tmp/mysql.sock'

透過下列指令重啟 mysql server

sudo /usr/local/mysql/support-files/mysql.server start


ERROR : ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'xxx'

登出 mysql

exit

以 root 權限重新登入 mysql

mysql -u root -p
 
over 7 years ago
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;

Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.imageid, opts);
int w = opts.outWidth;
int h = opts.outHeight;
  • inJustDecodeBounds 要設為 true,才不會將圖檔讀到記憶體中。
 
over 7 years ago

在 Mac 環境下,用 Terminal 進行操作時,如果指令太長,可以用 alias 創建別名。

alias c1="cd ~/Downloads"

但是上述方法創建出的別名,只會存在目前的 session,當 Terminal 一關閉,剛建立的別名就無法再被存取。要創建永久性的別名,需要編輯 ~/.bash_profile 這個檔案,每次 Terminal 開啟時,都會先執行這個檔案中的內容,所以宣告在檔案中的別名會重新建立。

  • 開啟 .bash_profile

    vi ~/.bash_profile
    
  • 輸入下列內容

    alias c1="cd ~/Downloads"
    alias c2="cd ~/Desktop"
    
  • 存檔後重新開啟 Terminal,即可使用別名

 
over 7 years ago

Android 在裝置方向改變時,會先將當前 activity 關閉,再重新啟動。所以有時候我們只是旋轉螢幕方向,系統卻會重新呼叫 onCreate。要避免這種現象,可以在 AndroidManifest.xml 設定檔中,針對特定的 activity 加入 android:configChanges 設定值。


android:configChanges

對於 configChanges 這個屬性,官方的開發文件中是這樣說明的:

  • Lists configuration changes that the activity will handle itself. When a configuration change occurs at runtime, the activity is shut down and restarted by default, but declaring a configuration with this attribute will prevent the activity from being restarted. Instead, the activity remains running and its onConfigurationChanged() method is called.

文件中提到,configuration 改變時,activity 會關閉再重啟,加入 android:configChanges 可以讓系統知道我們想要自行處理特定 configuration 的狀態改變,當狀態改變時,activity 會持續運作,並呼叫 onConfigurationChanged 這個 method。

要解決這個問題,可以加入以下的設定值:

android:configChanges="orientation|keyboardHidden|screenSize"
  • screenSize : added in API level 13


Reference

 
over 7 years ago

adb push 指令可以將檔案複製到裝置上,但如果我們嘗試將檔案複製到 /system 目錄下時,會發生 "Read-only file system" 的錯誤,這是因為 /system 目錄掛載時的預設權限都是唯讀,可依照下列步驟重新掛載成可讀寫的權限。

  1. 取得 root 權限

    adb root
    
  2. 重新掛載可取得讀寫權限

    adb remount
    
  3. 複製檔案到裝置上

    adb push test.txt /system/lib
    
 
over 7 years ago

一般相機程式,在旋轉裝置時,並不會將整個畫面一起旋轉(改變 activity 的 orientation),而是旋轉個別的按鈕,讓拍照畫面在旋轉時,視覺上能夠更平順。

想要達到這樣的效果,我們可以利用 RotateAnimation

RotateAnimation animation = new RotateAnimation(0f,
            180, 
            RotateAnimation.RELATIVE_TO_SELF,
            0.5f,
            RotateAnimation.RELATIVE_TO_SELF,
            0.5f);
animation.setDuration(700);
animation.setFillAfter(true);
myButton.startAnimation(animation);
  • Pivot type 和 pivot value 分別設為 RotateAnimation.RELATIVE_TO_SELF0.5f,按鈕才會以自己為中心旋轉。
  • setFillAfter 一定要設為 true,動畫結束後,才會停留在最後的旋轉角度,否則會回到原來的樣子。
 
over 7 years ago

不想讓螢幕進入休眠狀態,只要在程式中加入以下程式碼,就可以保持螢幕恆亮。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
over 7 years ago

BitBucket 支援兩種協定 : sshhttps。兩種協定各有優缺點, https 協定的好處是不用多做設定,但是每次 push 時都要輸入密碼。如果不想每次操作都要輸入密碼,可以選用 ssh 協定,但是第一次使用時,需要做一些設定。


ssh-keygen 產生公鑰和私鑰

首先,我們要先利用工具產生一組公私鑰,並把公鑰內容上傳至 Bitucket 網站,作為後續連線認證使用。Windows 環境下,可使用 PuTTY 這套工具,Mac OS 中,則可直接使用 ssh-keygen 指令產生公私鑰。

ssh-keygen
  • 輸入 ssh-keygen後,會詢問儲存路徑,預設路徑為 ~/.ssh/id_rsa,我們也可以自行輸入,例如 : ~/.ssh/id_rsa_test

  • 下一步則會要求輸入密碼,也可留空,但是一般不太建議這樣做,為了安全性,最好還是輸入一組密碼。

  • 完成後, ~/.ssh/ 目錄下會生成兩個檔案 : id_rsa_testid_rsa_test.pub。其中 id_rsa_test 是私鑰, id_rsa_test.pub 則是公鑰。


ssh-add

輸入 ssh-add 指令及上個步驟中的密碼,加入新的公私鑰。

ssh-add ~/.ssh/id_rsa_test


將公鑰內容上傳 BitBucket 網站

  • 將公鑰內容複製到剪貼簿

    pbcopy < ~/.ssh/id_rsa_test.pub
    
  • 到個人設定的 SSH keys 頁面中,按下 Add key 按鈕

  • 新增公鑰

    • Label : 顯示名稱,無特別限制。
    • Key : 將剪貼簿中的公鑰內容貼上。


上傳程式碼

  • Add remote repository

    git remote add origin git@bitbucket.org:yourusername/test.git
    
  • Push

    git push origin --all
    

    第一次 push 會出現以下訊息

    The authenticity of host 'bitbucket.org' can't be established.
    Are you sure you want to continue connecting (yes/no)? 
    

    選擇 yes,會將 bitbucket 的資訊加入 ~/.ssh/known_hosts 檔案中,接下來就可以順利上傳囉。

 
over 7 years ago

使用 git add 可以將檔案加入暫存區,如果想要取消時,該怎麼辦呢?我們可以使用 git reset 來取消暫存狀態。

git reset HEAD test1.java

如果連剛剛做的修改都想忽略,就用 git checkout 指令來還原。

git checkout test1.java