發表文章

目前顯示的是 十二月, 2012的文章

Some tips about Android JNI

和 JNI 奮鬥了一陣子, 隨手備忘查到的東西 用法和一般 Java JNI 差不多, 所以可以先參考一般 JNI 的用法, 再來看 Android JNI Tips: http://en.wikipedia.org/wiki/Java_Native_Interfacehttp://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html Android JNI Tips: http://developer.android.com/training/articles/perf-jni.html C 和 C++ 的寫法只有一點小差異, 見 Wikipedia 的範例, 這樣看別人的範例時, 可以一併參考 C 或 C++ 的 code JNI 的用法和 reflection 的概念差不多, 要先取得 class、再取得 method、再呼叫 method。所以比較需要查的是型別參數: 見 這裡的 Type Signatures constructor 的名稱是 <init> inner class 的型別用 $ 分隔, 比方 package com.mypkg 的 class A 內有 inner class B, 型別名稱為 Lcom.mypkg.A$B;。注意 inner class 為 non-static 時, 要先有 A 才能 new 出 B

在新的 thread 裡呼叫 method

若需要執行一個可能會花些時間的函式 (e.g., 有 blocking read) 但又不希望停住目前的 thread, 解法之一是產生一個新 thread, 然後在該 thread 執行原本欲執行的函式。先來看看 Python 遇到這種情況要怎麼作:import thread class A(object): def out(self): print 'A.out()' a = A() thread.start_new_thread(A.out, (a,)) # 就這行 相當地直覺。 在 C++ 裡想要執行 non-static member function 的話, 就有點惱人。解決的方法很多, 以下是我土法煉鋼的陽春解法。看 code 即可明白, 關鍵是使用 template 以及 pointer-to-member function。算是一個練習 template 的好題目, 還有了解 C++ 編譯時期多型的威力。 t.h#include <pthread.h> template<class T> struct MethodWrapper { typedef void(T::*Method)(); MethodWrapper(T *object, Method method) : m_object(object), m_method(method) {} void Run() { (m_object->*m_method)(); } T *m_object; Method m_method; }; // The interface for pthread's usage. template <class T> void* CallMethod(void *v) { MethodWrapper<T> *p = (MethodWrapper<T>*)v; p->Run(); delete p; return NULL; } template <class T> inline pthread_t RunInNewThread(MethodWrapper<T&g…