Android - JNI 串口通信


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文件后需要手动将其拷贝到该目录
}
3. 根据class文件生成头文件,再把生成的头文件移动到src/main/jni目录下
至此,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
这是因为项目中包含了jni文件夹和jni文件夹中需要ndk-build的c文件,AS会调用ndk-build去编译这些jni代码,但项目中却没有将“useDeprecatedNdk”设为true。解决方法:在gradle.properites中添加“android.useDeprecatedNdk=true”。此时AS每次编译build时会将jni中的代码编译成静态库并放到app/build/intermediates/ndk/debug/lib/下,APP运行时所调用的so库就是该目录下的so库,如果想只留下so库,而不再需要jni代码,需要做的是:①删除jni文件夹;②将app/build/intermediates/ndk/debug/lib/下已经编译好的so库拷贝至app/libs中,指定so存放目录build.gradle->sourceSets;③注释掉gradle.properites中android.useDeprecatedNdk=true。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值