文档章节

关于android jni 反调 java 的api

龙卷大风
 龙卷大风
发布于 2015/06/12 11:00
字数 597
阅读 39
收藏 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 Java虚拟机拦截技术分析

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

JayPark不作死
2014/02/21
0
1
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

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
46分钟前
0
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
3
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
2
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
3
0
中秋快乐!!!

HiBlock
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部