文档章节

关于android jni 反调 java 的api

龙卷大风
 龙卷大风
发布于 2015/06/12 11:00
字数 597
阅读 44
收藏 0

最近做了一个项目,用户要求用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
作品 0
济南
私信 提问
关于native层回调java层

1、关于jni调用种种情形的分析,可以参考一下如下网址中的文章:http://android.wooyd.org/JNIExample/ 2、native层回调java层: native层没有自己的线程,只是在java调用native代码,nativ...

LiSteven
2013/03/30
0
0
简单的安卓应用授权认证(JNI)

最近一直在做公司的一个安卓开发框架,含so库,接近尾声了,领导提出一个需求,要求使用这个框架的开发者必须有我们的授权才可以,但是对方发布的应用后又不能被此授权限制——要不然所有的应...

tnjin
2014/11/09
0
2
Android NDK开发简介

最近由于项目的需要,使用到了Android的NDK技术,对项目核心算法跨平台的移植。简答而言,就是使用C对原来的算法进行了改进,并集成到原来的app项目里。 从前的项目一直没有使用NDK进行开发的...

zhiweiofli
2013/03/07
0
0
android jni回调 转自http://android.wooyd.org/JNIExa...

Important notice<注意> The instructions in these document are applicable to older Android firmwares. Starting with firmware version 1.5 the Android NDK has been released, which......

貌似高手
2012/07/06
0
1
Android Java虚拟机拦截技术分析

最近反编译金山毒霸,分析其广告拦截功能是如何实现的。根据金山毒霸的介绍,采用了java虚拟机拦截技术,带着好奇去研究了一下。在查看代码过程中,会看到许多被hook的Java类,例如ActivityT...

JayPark不作死
2014/02/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
25分钟前
0
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部