Android - JNI 串口通信
|
项目名:行车数据
开发工具:Android Studio 2.1.2 / 2.2.3
JDK版本:1.8.0
Grade版本:2.10 ('classpath:com.android.tools.build:gradle-experimental:0.7.0-alpha3')
需求:其他公司的OBD通过汽车通用接口读取汽车数据,将数据传给Android智能后视镜的串口,由APP读取串口数据,并对串口数据进行处理之后上传至服务器(数据处理包括:按原OBD协议对数据进行解码,再按照本公司的OBD协议进行转码后通过NIO Socket发送至服务器),服务器将收到的数据保存下来,最后发送到手机APP端进行数据展示。
使用ADT Bundle进行JNI开发比较简单,使用Eclipse和Cygwin很容易就能进入开发了,但是在Android Studio下可就稍微费劲一点,这里指的是在build.gradle中所有配置信息最外层加上一个model{}的方式进行JNI开发,使用这种方式进行NDK开发有很多坑人地方,折腾了一整天程序终于跑起来了,使用半个月后也并没出现什么大问题,不过会引发其他小问题,例如在build.gradle中添加model{}之后会导致无法在android{}中配置signingConfigs信息,每次签名都得用build->Generate Signed APK,很麻烦!所以,我使用了另外一种更为简洁的方法:(这两种方法都不用自己创建Android.mk)
1. 下载NDK
配置ndk环境路径:
2. 配置新建工程,在其中一个类中添加本地方法声明,并执行Build->Cliear Project和Rebuild Project生成class文件
public class NewNdk { // JNI static { System.loadLibrary("NdkDevice"); // 调用jni生成的库 } public native static String display(); } |
3. 根据class文件生成头文件,再把生成的头文件移动到src/main/jni目录下
WDD:debug luohan$ cd app/build/intermediates/classes/debug
WDD:debug luohan$ javah -v -jni com.luohan.android_jni.NewNdk
[Creating file RegularFileObject[com_luohan_android_jni_NewNdk.h]]
WDD:debug luohan$ mv com_luohan_android_jni_NewNdk.h ../../../../src/main/jni/
|
新建一个.c文件,将头文件中所有内容拷贝到该文件中,将所有方法声明改成具体函数实现。如果#include<jni.h>报错说明第一步没完成,需检查NDK路径是否正确设置,确保NDK路径设置成功后build一下,继续后续步骤。
4.其他配置项:
(1)app/gradle.properties文件末尾加入:android.useDeprecatedNdk=true
(2)app/build.gradle的defaultConfig下加入ndk{}
ndk { moduleName "NdkJniDemo" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无。 }sourceSets.main{ jniLibs.srcDirs = [‘jniLibs’] //so指定存放目录,生成so文件后需要手动将其拷贝到该目录 } |
至此,java文件中声明本地方法的报错方法就不再报错了,点击sync projec顺利通过。生成是so文件放在app/build/intermediates/ndk/debug/lib/下,这是编译期间生成的,将其拷贝到app/libs中,然后即使删掉jni文件夹,也能通过so库调用display()方法了。
5.运行
可能出现的报错:
Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or ndk-build integration with the stable Android Gradle plugin:
or use the experimental plugin:
Information:BUILD FAILED
Information:Total time: 1.303 secs
Information:1 error
Information:0 warnings
Information:See complete output in console |