2016年2月27日 星期六

Android 開發筆記 - 在 Android Studio 環境上使用 NDK (JNI) @ Mac OS X 10.11.3

上一次把玩已經是 2011 年的事了 :P 這次再練一下。首先,我已經安裝好 Android Studio 1.5.1 版本。接著先下載 Android NDK:

Android Studio -> SDK Manager -> Android SDK -> SDK Tools -> 勾選 Android NDK (1.0.0) -> 進行下載。下載完後可以看到 Project -> local.properties 已經自動埋好 ndk.dir=/path/ndk 資訊啦,若一開始 local.properties 有 ndk.dir 資料,或許會造成問題。

接著,依照 http://tools.android.com/tech-docs/new-build-system/gradle-experimental#TOC-Ndk-Integration 簡介在 build.gradle (Module: app) 添加這一段:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"
        ndk {
            moduleName "native"
        }
    }
}


Sync Now 後,立馬得到: Error:(23, 0) Plugin with id 'com.android.model.application' not found.

找了很久,最後參考 googlesample 範例(隨便挑一個,例如:https://github.com/googlesamples/android-ndk/blob/master/MoreTeapots/app/build.gradlehttps://github.com/googlesamples/android-ndk/blob/master/MoreTeapots/build.gradle),做了很多動作:

先到 build.gradle (Project) 更新:

dependencies {
        //classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
}


再把 build.gradle (Module: app) 整段更新:

/*
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "YourAppPackageName"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
// */

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "YourAppPackageName"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-rules.pro'))
        }
    }
    android.ndk {
        moduleName = "native"
    }
}


按下 Sync Now 後,終於沒問題了,離 JNI 又更進一步了!

再點擊 app 目錄 => 按右鍵 New -> Folder -> JNI Folder ,再到 jni 目錄添加一下檔案 -> New -> C/C++ Source file -> 此例用 main.cpp/main.h 為例。

如此一來,只要 Build APK 後,跑去 unzip app-debug-unaligned.apk 後,可以看到以下的目錄結構:

$ tree lib/
lib/
├── arm64-v8a
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── armeabi
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── armeabi-v7a
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── mips
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── mips64
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── x86
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
└── x86_64
    ├── gdb.setup
    ├── gdbserver
    └── libnative.so


其中 libnative.so 則是跟 android.ndk 裡定義的名字。

2016年2月20日 星期六

使用 Jubler 調整字幕 srt 時間軸 @ Mac OS X 10.11.13

VLC Subtitle Shift time

又有一陣子沒在看影片,都忘了當初也做過一樣的事,因此來紀錄一下 Orz

簡言之有一套免錢的軟體叫做 Jubler Subtitle Editor,這套需要 Java 執行環境,透過他就可以把字幕播放時間平移,以此達到修正字幕播放時間。

修正 Windows VLC UTF-8 字幕亂碼的問題 @ Windows 10

首先,字幕很確定是 UTF-8 了,因為在 VLC @ Mac OS X 是正常的,但一樣的檔案搬去 Windows 10 則無法正常顯示。

VLC Player -> 工具 -> 偏好設定:

  • 預設編碼: UTF-8
  • 字型:Microsoft YaHei
一開始以為換編碼就行了,接著以為字型換中文(細明體)的就行了,最後還是上網查別人的招數,竟然連字型也是個關鍵 Orz

使用 VLC 動態調整字幕時間軸 (Sub sync: set bookmark first) @ Mac OS X 10.11.13

很多播放軟體都有提供延遲或增快字幕的播放機制,但很多都是預先要設定個秒數,不見得方便。最近使用 VLC 後,發現他有非常人性化的設置,當你要處理字幕跟影片的落差時,假設字幕跑得比較快,可以先用 Shift+J 快速鍵記錄某字幕出來的時間,接著當你聽到對應聲音的時間時,請用 Shift+H 記錄,接著再按 Shift + K 後,VLC 就自動幫你同步好了!實在方便啊,紀錄一下。

若字幕或聲音沒有都設置 bookmark 時,直接按 Shift + K 會得到:Sub sync: set bookmark first 訊息。

筆記:

  • Shift + H:定位 Audio 時間位置
  • Shift + J:定位 Subtitle 時間位置 
  • Shift + K:將 Audio 跟 Subtitle 時間同步

2016年2月18日 星期四

[Linux] 使用 find -ctime 刪除指定時間區間的檔案 @ Ubuntu 14.04

find -ctime 指令非常方便,例如找時間大於七天的資料:

$ find /path -ctime +7

所以要刪除七天以上的資料,的確可以靠上述完成,但如果有備份程式掛了沒產出時,豈不是會刪光資料?所以又有一招可以找最新七天內的資料:

$ find /path -ctime -7

因此,我就把自動清空指令改成:先判斷備份程式是否正常,正常的話,則刪除某段時期的資料。

連續動作:

$ sh -c  'files=`find /data/jenkins-backup -maxdepth 1 -ctime -7 | wc -l` && test $files -gt 20 && find /data/jenkins-backup -ctime +7 -delete '

而這段意思就是在處理 Jenkins 自動備份機制,因為一天會備份多次,所以用 20 個當作七天內至少要有 20 筆備份資料,當備份資料有正常產出時,在刪除大於七天內的資料。而採用 sh -c 的方式是可以埋在 crontab 中來做事,包含指定 sudo -u user 來限制不小心砍錯資料。