android_NFC

本文深入探讨了RFID和NFC技术的基础知识,包括标准、类型和应用。同时,介绍了Android系统如何通过NFC实现多种功能,如NFC卡片模拟和移动支付。最后,分析了NFC手机的NXP芯片使用情况和全球移动支付市场的现状。

【RFID】
RFID(Radio Frequency Identification),射频识别技术,工作在13.56MHz频段。
在RFID标准中定义了读卡器和卡(标签)两种设备。
RFID主要标准有:ISO14443A,B,也就是使用飞利浦的MIFARE标准。
索尼公司的FeliCaTM标准。
RFID的卡有:TypeA,TypeB,TypeF等。

【NFC】
2003年,philips和sony联合对外发布关于一种兼容当前 ISO14443 非接触式卡协议的无线通讯技术,取名NFC(Near Field Communication)。
NFC的基本标签类型有四种,以1至4来标识,各有不同的格式与容量:
第1类标签(Tag 1 Type):此类型基于ISO14443A标准。此类标签具有可读、重新写入的能力,用户可将其配置为只读。存储能力为96字节,用来存网址URL或其他小量数据富富有余。然而,内存可被扩充到2k字节。此类NFC标签的通信速度为106 kbit/s。此类标签简洁,故成本效益较好,适用于许多NFC应用
第2类标签(Tag 2 Type):此类标签也是基于ISO14443A,具有可读、重新写入的能力,用户可将其配置为只读。其基本内存大小为48字节,但可被扩充到2k字节。通信速度也是106 kbit/s。
第3类标签(Tag 3 Type):此类标签基于Sony FeliCa体系。具有2k字节内存容量,数据通讯速度为212 kbit/s。故此类标签较为适合较复杂的应用,尽管成本较高。
第4类标签(Tag 4 Type):此类标签被定义为与ISO14443A、B标准兼容。制造时被预先设定为可读/可重写、或者只读。内存容量可达32k字节,通信速度介于106 kbit/s和424 kbit/s之间。

【Android NFC】
Android2.3.3引入NFC功能。
Android NFC有分卡模式,读卡器模式和点对点模式,在NFC里面取消了原来读卡器和卡的概念,只有NFC设备。

读卡器模式下,利用task laucher类似的后台,可以定义各式各样的tag,满足个性化的需求。
点对点模式,点点touch就可以分享数据,beam真的很方便。
卡模式可以模拟各种卡,公交卡,员工卡,金融卡是最具诱惑的,在feature phone的年代,运行商是推广移动支付的主力,那时候NFC是集成在卡里面的,移动大潮下各方势力介入,出现了sd卡式,集成式,sim卡式方案。
Android4.4引入HCE,统一了NFC标准,为NFC移动支付的推广打下了基础。
Iphone6引入了Apple Pay,Android5.0也有Android Pay,银联也再推NFC支付,取消了圈存,应该可以和支付宝们斗一斗了。

【案例分析】
现在,主流NFC手机采用的都是NXP的NFC控制芯片。

【NFC认证】
国际上NFC手机想要移动支付,需要过VISA,MASTERCARD等几大组织的EMVCo认证。



Android 中的 `UnsatisfiedLinkError` 通常表示应用尝试调用本地方法(Native Method)时,找不到对应的本地库实现。具体到错误 `No implementation found for void com.android.nfc.dhimpl.NxpNativeNfcManager.resetDiscoveryTech`,该错误表明系统无法找到 `NxpNativeNfcManager` 类中的 `resetDiscoveryTech` 方法的本地实现。 ### 错误原因 1. **本地库缺失或未正确加载**:Android 应用依赖的本地库(通常是 `.so` 文件)可能未被正确加载或缺失。这可能由于库文件未包含在 APK 中,或未在正确的架构目录(如 `armeabi-v7a`、`arm64-v8a`、`x86` 等)下放置。 2. **方法未实现**:Java 层声明的本地方法在 C/C++ 层未提供对应的实现。这可能发生在开发者自行修改了本地代码,但未完成所有方法的实现。 3. **库版本不兼容**:使用的本地库版本可能与当前运行的 Android 版本或设备架构不兼容。 4. **类路径或方法签名不匹配**:本地方法的类路径或参数类型与 Java 层声明的不一致,导致系统无法找到匹配的实现。 ### 解决方案 1. **检查本地库的完整性**: - 确保所需的 `.so` 文件已正确打包到 APK 的 `lib` 目录下,并且支持当前设备的架构。 - 使用 `adb` 命令检查设备上是否加载了正确的库文件: ```bash adb shell pm dump <package_name> | grep "nativeLibraryDir" ``` 2. **验证本地方法的实现**: - 检查本地代码中是否实现了 `resetDiscoveryTech` 方法。确保方法的签名与 Java 层一致,包括类名、方法名和参数列表。 - 方法的命名规则应遵循 JNI 的命名规范,例如: ```c void Java_com_android_nfc_dhimpl_NxpNativeNfcManager_resetDiscoveryTech(JNIEnv *env, jobject obj) { // 方法实现 } ``` 3. **检查类路径和方法签名**: - 确保 Java 层声明的本地方法与本地代码中的实现完全匹配。例如: ```java public class NxpNativeNfcManager { public native void resetDiscoveryTech(); } ``` 4. **更新或重新安装依赖库**: - 如果问题出现在使用第三方库时,尝试更新到最新版本,或联系库的维护者以获取支持。 5. **调试与日志**: - 在应用启动时,检查是否成功加载了本地库: ```java static { try { System.loadLibrary("nfc-impl"); } catch (UnsatisfiedLinkError e) { Log.e("NFC", "Failed to load native library", e); } } ``` - 使用 `adb logcat` 查看详细的错误日志,定位问题根源。 ### 示例代码 以下是一个简单的 JNI 方法实现示例,用于演示如何在本地代码中实现 Java 层的本地方法: ```java public class NativeExample { public native void printMessage(); static { System.loadLibrary("native-lib"); } } ``` 对应的本地实现(C/C++): ```c #include <jni.h> #include <string> #include <android/log.h> #define LOG_TAG "NativeExample" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) extern "C" JNIEXPORT void JNICALL Java_com_example_NativeExample_printMessage(JNIEnv *env, jobject /* this */) { LOGE("Native method called"); } ``` ### 相关问题 1. 如何在 Android 中正确加载本地库? 2. JNI 方法的命名规则是什么? 3. 如何通过 `adb` 命令检查本地库是否被正确加载? 4. 如何调试 Android 中的 `UnsatisfiedLinkError`? 5. 本地方法的签名不匹配会导致什么问题?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值