android JNI 中有很多需要用到 Native 对象的需求,它的实现非常的简单,下面以 Paint 为例记录一下。
Paint.java (frameworks\base\graphics\java\android\graphics)
public class Paint {
public int mNativePaint;
public Paint(int flags) {
mNativePaint = native_init();
... ...
}
private static native int native_init();
... ...
};
Paint.cpp (frameworks\base\core\jni\android\graphics)
class SkPaintGlue {
static SkPaint* init(JNIEnv* env, jobject clazz) {
SkPaint* obj = new SkPaint();
defaultSettingsForAndroid(obj);
return obj;
}
... ...
};
static JNINativeMethod methods[] = {
{"native_init","()I", (void*) SkPaintGlue::init},
... ...
};
Java 层的 mNativePaint 为 int, 对应 Native 层 SkPaint* 。
这样一来,当需要在 Java 层操作 Native 层对象时,只要传递 mNativePaint 这个 int,Native 就知道是操作 SkPaint 这个指针了。
非常简单,我却觉得很强大,很巧妙。
试想,如果当初由自己来实现时,在考虑如何在 Java 层表示 Native 层的 C++ 对象时,会不会想到指针和整型呢。