文档章节

关于android jni 反调 java 的api

龙卷大风
 龙卷大风
发布于 2015/06/12 11:00
字数 597
阅读 39
收藏 0
点赞 0
评论 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
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
Android平台上的JNI技术介绍

NDK简介 Android是由Google领导开发的操作系统,Android依靠其开放性,迅速普及,成为目前最流行的智能手机操作系统。 图0-1 Android系统架构图 图0-1是Android系统架构图。大多数程序位于最...

ChowJames
2012/10/01
0
0
libcurl在android下的移植、编译与测试以及java接口的封装

curl是利用URL语法在命令行方式下工作的文件传输工具 它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。 curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT...

zhoulc
2013/03/05
0
2
Android: NDK编程入门笔记

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C...

gongweixin
2013/04/23
0
3
如何让Java和C++接口互相调用:JNI使用指南

写在前面的话 对于cocos2d-x开发者而言,游戏对多平台的支持是一个刚需,一般而言需要支持Android和iOS。然而,在开发过程中,android 平台遇到的一系列问题着实让人头疼,本文以集成新浪微博...

zhangyujsj
2015/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
14分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
28分钟前
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
29分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
37分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
41分钟前
1
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
1
0
继社会佩奇之后,又尝试了可爱的蓝胖子,有趣 Python

#哆啦A梦# !/usr/bin/env python3# -*- coding: utf-8 -*-# @Author: dong dong# @Env: python 3.6from turtle import *# 无轨迹跳跃def my_goto(x, y): penup(...

Py爱好
昨天
0
0
shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部