Andorid BluetoothSocket的工作原理之四

问题点6:Android(原生) BT BluetoothSocket.javaInputStream已被重写

---在原生Framework中,我们看到在BluetoothSocket.java中使用InputStream中的read进行数据读取,但在实际checking中发现InputStream 中的readwriteclose已经被重写

-->当我们执行Java层的Socket 监听函数bindListen时,

发现原生Source Code 中并没有直接使用ParcelFileDescriptor 中方法进行数据操作,而是通过交给LocalSocket并得到InputStream 和OutputStream;(Note: 关键点在此:mSocket.getInputStream和mSocket.getOutputStream)

-->执行readInt 函数进行4Byte数据监听,来获取Channel ID

 -->调用readAll 方法,在此函数中最终调用read();

 Attention:如果我们checking Code ,很可能就直接理解为其是调用InputStream中的read 方法;---这是有偏差的;

关键在前面的mSocket.getInputStream中;

-->getInputStream中,其调用类LocalSocketImpl 中的getInputStream

-->SocketInputStream extend InputStream,并重写了read等方法;

SocketOutputStream重写了OutputStream

-->重写后的Read方法,调用JNI 方法readba_native进行data 读取,

最终实现在android_net_LocalSocketImpl.cpp (frameworks\base\core\jni)

 

 -->C++socket_readba -->socket_read_all-->recvmsg;

 小结:所以BluetoothSocket中的readwrite等操作,Code表面是调用InputStream OutputStream进行操作,但实际上这里的InputStream OutputStream已被重写,最终调用的是C++中的socket 操作方法并返回读取到的data

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值