2013年12月10日 星期二

在 JNI 程式碼使用 Logcat

在 Android 應用的程式碼裡,可以使用 Log.v()、Log.d()、Log.i() 等函式將訊息送到 log output,然後開發者可以透過 Logcat 查看。

但,如果在 Android 應用裡使用了 JNI 及 NDK,又該如何將訊息送到 log output,才能在 Logcat 裡查看呢?

首先,查看了 NDK 的 docs/STABLE-APIS.html,找到這段說明:

Android-specific Log Support:
<android/log.h> contains various definitions that can be used to send log messages to the kernel from your native code. Please have a look at its content in (platforms/android-3/arch-arm/usr/include/android/log.h), which contain many informative comments on how to use it.
You should be able to write helpful wrapper macros for your own usage to access this facility.
If you use it, your native module should link to /system/lib/liblog.so with:
    LOCAL_LDLIBS := -llog 

然後在 android/log.h 裡找到:

/*
 * Android log priority values, in ascending priority order.
 */
typedef enum android_LogPriority {
    ANDROID_LOG_UNKNOWN = 0,
    ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */
    ANDROID_LOG_VERBOSE,
    ANDROID_LOG_DEBUG,
    ANDROID_LOG_INFO,
    ANDROID_LOG_WARN,
    ANDROID_LOG_ERROR,
    ANDROID_LOG_FATAL,
    ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */
} android_LogPriority;

/*
 * Send a formatted string to the log, used like printf(fmt,...)
 */
int __android_log_print(int prio, const char *tag,  const char *fmt, ...)
#if defined(__GNUC__)
    __attribute__ ((format(printf, 3, 4)))
#endif
    ; 

接著,拿 NDK samples 裡的 hello-jni 來試試。首先,修改 jni/Android.mk,加入這行:

LOCAL_LDLIBS += -llog 

再修改 jni/hello-jni.c,除了引入 android/log.h 這個標頭檔,並使用 __android_log_print 將訊息送到 log output。

#include <android/log.h>

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    __android_log_print(ANDROID_LOG_INFO, "HelloJNI", "Show: Hello from JNI !");
    return (*env)->NewStringUTF(env, "Hello from JNI !");
} 

如此,當這隻程式執行時,就可以在 Logcat 裡查看由 __android_log_print 送出的訊息了。

2013年12月4日 星期三

使用 PhotoShop 製作暗角效果

使用 PhotoShop 在相片上製作暗角並不是很麻煩的事,利用「光源效果」這個濾鏡就可以達成了。

首先在 PhotoShop 上開啟一張相片,然後從下拉選單的「濾鏡」,找到「演算上色」裡的「光源效果」:

點擊光源效果這個濾鏡後,在 PhotoShop 的左上方會出現幾個預設集,這裡直接選擇「手電筒」這個預設集。

當選擇不同的預設集時,在 PhotoShop 右側的這個欄位也會隨著改變,使用者也可以直接從這裡修改想要的光源效果。

而在圖上會出現像這樣的圈,它可以用來調整光源的大小(縮放)、明暗度和位置。

通常我喜歡將暗角效果弄明顯一點。簡單講,就是讓它暗一點。

最後,再用筆刷將圖片中央範圍的效果刷淡一些,完成的效果就像這樣囉!

2013年12月3日 星期二

自製 PhotoScape 的版型

PhotoScape 提供了「版型」這個選項,讓使用者可以將多張相片排列成一張圖片。這陣子以來,這個功能也是我時常使用的一個,讀者可以參閱《使用 PhotoScape 製作活動記錄或花絮合輯》這篇文章。

然而,使用一段時間之後,總覺得 PhotoScape 預設提供的版型選項有點不足。於是,我便開始在 Google 上尋找如何製作版型的相關文章或討論。終於讓我找到了《[實用] PhotoScpae自製版型》這篇文章。在該篇文章裡以一個較簡單的例子說明了如何製作版型;而這裡我則乾脆找一個複雜點的版型,再說明一下吧!

首先,所有的版型都會被放置在 PhotoScape 安裝目錄內的 page 目錄下。由於我的 Windows 是 64 位元的,所以可以在 C:\Program Files (x86)\PhotoScape\page 找到所有的版型檔案。這時可以看到版型的副檔名為 .pgt,這其實只是一個純文字檔案而已。所以,使用者可以很輕易地用「記事本 (Notepad.exe)」這個軟體,或使用 VIM 打開。

接著,來看一個我比較常用的版型。

  1. 這個版型可放置 16 張相片。
  2. 版型檔案的主檔名 (main_e_02) 和檔案裡描述的 title 相符。
  3. 版型預設大小為 400X400,所以在版型的檔案裡描述了 page_size=400 400。

基本上,搞懂這些後,就可以製作一個版型囉!

最後,來看一個自製的版型效果,同時我也將這個版型的內容附上來供大家參考。

version=1.0
title=7X8_32_1
page_type=blank
page_size=700 800
page_entity=photo rect 0 0 200 200
page_entity=photo rect 200 0 100 100
page_entity=photo rect 300 0 100 100
page_entity=photo rect 400 0 100 100
page_entity=photo rect 500 0 200 200

page_entity=photo rect 200 100 100 100
page_entity=photo rect 300 100 200 200

page_entity=photo rect 0 200 100 100
page_entity=photo rect 100 200 200 200
page_entity=photo rect 500 200 100 100
page_entity=photo rect 600 200 100 100

page_entity=photo rect 0 300 100 100
page_entity=photo rect 300 300 100 100
page_entity=photo rect 400 300 200 200
page_entity=photo rect 600 300 100 100

page_entity=photo rect 0 400 100 100
page_entity=photo rect 100 400 100 100
page_entity=photo rect 200 400 100 100
page_entity=photo rect 300 400 100 100
page_entity=photo rect 600 400 100 100

page_entity=photo rect 0 500 100 100
page_entity=photo rect 100 500 200 200
page_entity=photo rect 300 500 100 100
page_entity=photo rect 400 500 100 100
page_entity=photo rect 500 500 200 200

page_entity=photo rect 0 600 100 100
page_entity=photo rect 300 600 200 200

page_entity=photo rect 0 700 100 100
page_entity=photo rect 100 700 100 100
page_entity=photo rect 200 700 100 100
page_entity=photo rect 500 700 100 100
page_entity=photo rect 600 700 100 100 

2013年12月2日 星期一

如何從 Linux Mint 15 升級至 Linux Mint 16?

我猜想,最近 Linux 玩家關注的消息或許是 Linux Mint 16 終於正式發佈了:

這幾天大概 Linux Mint 的伺服器會很忙,因為有不少玩家想下載試試或升級的。好吧!我就是其中一個想從 Linux Mint 15 升級到 Linux Mint 16 的人。在 Linux Mint 網站的文章裡提到,想升級的使用者可以參閱這篇文章的內容:

基本上,該篇文章介紹了 "Fresh" 升級的方式。這個方式簡單說就是下載 Linux Mint 的 LiveCD,然後重新安裝並覆蓋原來的系統。但,其實我比較喜歡採用 "Package" 升級的方式,也就是直接使用 APT 指令來做。之前在 Debian GNU/Linux 已經嘗試過幾個版本的跨版本升級了,並沒有遇到什麼問題;在 Linux Mint 目前則是頭一遭,希望也是能順利完成呀!

首先,我們必須修改 sources.list 的內容,找到 /etc/apt/sources.list.d/official-package-repositories.list,然後將 olivia 修改成 petra;並將 raring 修改成 saucy。其中,Petra 是 Linux Mint 16 的代碼;而 Saucy 是 Ubuntu 13.10 的代碼。

$ sudo sed -i 's/raring/saucy/' /etc/apt/sources.list.d/official-package-repositories.list

$ sudo sed -i 's/olivia/petra/' /etc/apt/sources.list.d/official-package-repositories.list

接著執行 APT 指令升級系統:

$ sudo apt-get update; sudo apt-get dist-upgrade

其實,直接編輯 /etc/apt/sources.list 加入 Linux Mint 16 需要的套件庫就可以了。不過由於 Linux Mint 的 /etc/apt/sources.list 實值上是空的,所有的套件來源都放在 /etc/apt/sources.list.d 這個目錄裡,因此才會改成修改 /etc/apt/sources.list.d/official-package-repositories.list 這個檔案。

2013年11月28日 星期四

使用 PhotoCap 製作不規則的拼貼圖

PhotoCap 是由國人 Johnson Wang 所開發的一個相片編修軟體,使用者可以在 http://www.photocap.com.tw/forum/ 這個網站找到更多有關於 PhotoCap 的討論,也可以在該網站下載到目前最新的版本 (PhotoCap 6.0)。

在這篇文章裡,我將示範如何使用 PhotoCap 來製作相片拼貼。首先,從下拉式選單「功能」找到「照片拼貼」:

接著會出現載入相片的對話框,按下左上方的「載入照片」:

然後選擇要加入拼貼的相片:

載入相片後,若選擇「開啟隨機角度」,那麼就可以製作不規則排列的拼貼了。在這個對話框只是先做隨機的拼貼,按下 OK 後,會進入 PhotoCap 的編修視窗。

在編修視窗裡,右側會將所有加入的相片各自成為一個圖層,此外也可以在調整每一張相片的大小、角度和位置。

這篇文章一開始我使用了白色的背景,若一開始選擇「照片拼貼」前先打開一張相片,那麼就可以用那張相片作為拼貼的背景圖了。

最後,來看一下拼貼完成的照片吧!

2013年11月13日 星期三

在 Debian GNU/Linux 7 安裝 Node.js

在 Debian GNU/Linux 7 的套件庫裡並沒有 Node.js 的套件,若要安裝 Node.js 需要由 http://nodejs.org/ 下載源碼編譯安裝。

首先下載當前的版本 node-v0.10.22.tar.gz,此外亦可以參考以下文章編譯:

  1. 在Debian Squeeze 上编译 node.js

也使用 FPM 將編譯的結果製成 .deb 檔,步驟如下:

$ tar zxvf node-v0.10.22.tar.gz
$ cd node-v0.10.22
$ ./configure 
$ make
$ mkdir _install && make install DESTDIR=_install
$ fpm -s dir -t deb -n nodejs -v 0.10.22 -C _install usr

執行完成後會生成 nodejs_0.10.22_amd64.deb 這個檔案,接著安裝即可:

$ sudo dpkg -i nodejs_0.10.22_amd64.deb