通常设备层有数据或事件要通知到应用层是通过回调来完成的,可以采用的方式是直接调用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