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报错说明第一步没完成,需检查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: https://developer.android.com/studio/projects/add-na tive-code.html   or use the experimental plugin: http://tools.android.com/tech-docs/new-build-system/gradle-experimental.
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. Linux平台下搭建OgreKit on Android开发环境
  2. 教你如何开发一款实用的完整Android(安卓)App
  3. Android开发环境搭建和HelloWorld
  4. AndroidStudio 项目打包成jar和aar
  5. FlatBuffers在android的使用简介
  6. 使用Android(安卓)studio 开发xposed插件
  7. android命令行编译生成apk(翻译官方文档)
  8. [Android]使用全局变量传递数据
  9. unity3D,PC、Android、IOS将内容复制到剪切板

随机推荐

  1. 《Android高级进阶》— Android 书籍
  2. 安卓基础学习 Day01 |第一个安卓应用程序
  3. Android应用程序发送广播(sendBroadcast)的
  4. Android 设置图片的四个角 为圆角
  5. android的ListView显示
  6. Android(安卓)6.0 之AlarmManagerService
  7. Android Camera2 API 学习笔记2
  8. android 鐢佃瘽褰曢煶
  9. Service实例-播放mp3音乐
  10. android 文字滚动动画