和 JNI 奮鬥了一陣子, 隨手備忘查到的東西
用法和一般 Java JNI 差不多, 所以可以先參考一般 JNI 的用法, 再來看 Android JNI Tips:
- http://en.wikipedia.org/wiki/Java_Native_Interface
- http://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
你需要從 Java call 的 C function 數量多時該看看 JNA:
回覆刪除https://github.com/twall/jna/blob/master/www/GettingStarted.md
它像 Python 的 ctypes 一樣,手上有 (lib_name, function_name) 然後用 Java 表示參數與傳回型態後就能呼叫了。省掉了寫跟編譯 C wrapper library。
謝啦, 目前只有偶而寫一下 Android 程式而已。現在在專心補強 iOS 開發相關能力。待之後有更多需求或自己需新開專案時來參考看看。
回覆刪除