从Camera源码看如何从Jni回调到Java层

本文探讨了Android Camera组件中,如何从JNI层回调到Java层的过程。通过分析源码,指出Camera在初始化时如何保存WeakReference,并在JNI层触发回调时,检查WeakReference的有效性,确保数据正确传递。同时,文章揭示了JNI层如何通过保存的Java对象引用避免内存泄露,以及在多线程环境下回调的安全性。
摘要由CSDN通过智能技术生成

通常设备层有数据或事件要通知到应用层是通过回调来完成的,可以采用的方式是直接调用java层类静态函数,或者调用java层某个对象的普通函数,

涉及几个问题:
1,内存泄露,引用问题
2,多线程问题

首先研究一下Camera的实现,首先打开Camera返回一个Camera对象,setPreviewCallback传入了一个callback,这个callback没有传入jni层,只是在Camera对象内部保存下来了,之后会用到。Camera的构造函数中会调用native层的初始化函数native_setup,将Camera对象自己的WeakReference作为参数传给jni层。这里要考虑一下为什么不直接传入Camera对象呢,jni层有弱全局引用同样可以达到类似效果。

当Camera底层有数据要回调到Java层时,由于jni层保留了Camera对象的WeakReference,所以jni层调用java层的Camera类的静态函数postEventFromNative,传入Camera对象的WeakReference以及其他参数,看如下实现:

private static void postEventFromNative(Object camera_ref, int what, ...) {
    Camera c = (Camera)((WeakReference) camera_ref).get();
    if (c == null)
        return;

    if (c.mEventHandler != null) {
        Message m = c.mEventHandler.obtainMessage(what, arg1, arg2, obj);
        c.mEventHandler.sendMessage
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值