android JNI 获取 Native 对象

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++ 对象时,会不会想到指针和整型呢。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值