关于android jni 反调 java 的api
关于android jni 反调 java 的api
龙卷大风 发表于3年前
关于android jni 反调 java 的api
  • 发表于 3年前
  • 阅读 10
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

最近做了一个项目,用户要求用so库实现蓝牙通信。由于android有蓝牙通信的api,而我也没找到 通过jni方式进行蓝牙读卡的开源代码。无奈之下只好用jni 反调 java 的 蓝牙通信api实现了。

其实android下的蓝牙读卡挺简单:

1,通过 BluetoothAdapter.getDefaultAdapter() 获取蓝牙适配器对象

2,判断蓝牙是否已被使能 mBluetoothAdapter.isEnabled()。如未使能,则通过intent 弹出打开蓝牙的对话框

3,调用mBluetoothAdapter.startDiscovery() --查找,或者是 mBluetoothAdapter.getBondedDevices()---获取已绑定的蓝牙设备    来选择一个蓝牙设备,并获取其设备名和mac地址

4,如果是通过查找选择蓝牙设备,要查看绑定状态 getBondState,如果未绑定的话,要调用 createBond 进行绑定。

5,获取蓝牙设备的 uuid。

6,调用createRfcommSocketToServiceRecord 创建socket。

7,调用 connect 建立连接。

8,getInputStream 获取输入流; getOutputStream 获取输出流

如果以上都没有问题,ok,蓝牙的连接就建立了,下面就可以通过 inputstream 和 outputsteam 收发数据了。

注意事项:

a,在  通过 GetMethodID 查找java的api时的签名问题,如  (*env)-> GetMethodID( env, C_android_bluetooth_BluetoothAdapter, "getRemoteDevice","(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;");

"(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;" -------java api 在jni中的签名

括号内为参数,括号外为返回值。非基本类型要用全类名加“;”间隔。

b,在反调java的api之前要进行异常检查。否则异常发生了,你还要去调用,就好造成营养崩溃。其实,调用后我也作了检查。。。

c,android 5.0之前和之后的版本,在jbyteArray 数组元素获取方面有差异。之前的版本,在函数中定义一个 jbyteArray 对象,然后定义 一个 jbyte* 来获取 jbyteArray 的元素 (通过 GetByteArrayElements),在函数返回之前,如果 jbyteArray  改变了,jbyte* 的内容会同步更新;但在5.0之后不会了,必须每次都重新调用 GetByteArrayElements获取数据。

d,关于 5.0前后版本的另外一个问题,如果 你通过 malloc申请了一块内存,判断是否成功的办法应该是 判断其返还值是否 为 0,如果非0,则成功;否则失败。千万不要通过是否 大于0来判断,因为其地址是有可能被认为是负数的。。。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 1
码字总数 597
×
龙卷大风
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: