在工作有一个这样的需求:在一个Android App上,通过串口对一个蓝牙进行操作,其中包括发送消息,接收消息,并进行处理。

Android系统串口收发实例文件:url80.ctfile.com/f/25127180-740368020-b35f1f?p=551685 (访问密码: 551685)

要实现这些功能,有很多种:多线程可以放在Jni层,这样接收和消息的整理逻辑都在Jni层,这样程序就会变得复杂一些,因为你不仅要Java调用C,还要C调用Java。我们也可以把这些逻辑层放在App层处理,Jni层只负责打开串口文件,并fd组织成FildDescriptor返回给App。其实如果按照程序的封装设计,Jni不应该有过多的逻辑处理,逻辑处理都应该交给App,用Java来写,这样的优点在于,相对于C来说,Java比较好写,不用考虑指针和垃圾回收,内存溢出,线程安全等问题也会少很多。最重要的是,把逻辑处理放在App容易提高整个程序的维护性,和Jni层的复用性,只要把Jni打包成库给别人使用即可。但是我们考虑到,C的效率更高,最主要C对字符处理和位的处理更容易。然后就很任性地选择了用C来实现一些杂乱的处理,当然,也是想挑战一下Jni下的编程。这里面也确实遇上了很多问题,这里就做一些简单总结吧。

首先,我们Jni还是用C++写比较好。因为如果你比较懒,在Jni 编程里面提供的接口,一个同名的函数C++比C会少一些传参,具体比较一下jni.h就可发现。然后还有一个问题,在Android系统的Frameworks里会使用Jni会做一些工具,如果我们把我们写好的Jni放进系统里编译就可以很方便地利用这些工具,如用AndroidRuntime 可以很方便地获得Jnv(运行时环境)和JavaVm(当前App的虚拟机)。用C++还有一个优点是,如果你是C++编程高手,你可以很容易用C++写一个架构很好的Jni,如果不是,你也可以当C来用。


方法引用主要指通过方法的名字来指向一个方法而不需要为方法引用提供方法体,该方法的调用交给函数式接口执行。
方法引用是在特定场景下lambda表达式的一种简化表示,可以进一步简化代码的编写使代码更加紧凑简洁,从而减少冗余代码。

1.2 语法格式
方法引用使用一对冒号 :: 将类或对象与方法名进行连接,以Person类为例。

1.3 设置对象的姓名
1.3.1 使用匿名内部类的方式

1.3.2 使用lambda表达式的方式

1.3.3 使用方法引用的方式
对象的非静态方法引用:ObjectName :: MethodName

1.4 展示信息
1.4.1 使用匿名内部类的方式

1.4.2 使用lambda表达式的方式

1.4.3 使用方法引用的方式
类的静态方法引用:ClassName :: StaticMethodName

1.5 比较对象的姓名
1.5.1 使用匿名内部类的方式

1.5.2 使用lambda表达式的方式

1.5.3 使用方法引用的方式
类的非静态方法引用:ClassName :: MethodName

1.6 对象的创建
1.6.1 使用匿名内部类的方式

1.6.2 使用lambda表达式的方式

1.6.3 使用方法引用的方式
构造器的引用:ClassName :: new

1.7 对象数组的创建
1.7.1 使用匿名内部类的方式

1.7.2 使用lambda表达式的方式

1.7.3 使用方法引用的方式
数组的引用:TypeName[] :: new