bcoder

Android中ndk开发步骤

 分类:Android, Java 阅读 (23)  Android中ndk开发步骤已关闭评论
9月 062019
 
一、环境

Android Studio 3.4.2

c++编译器:cmake

本文从一个不包含c++支持的项目开始添加ndk的开发

二、修改build.gradle

在app/build.gradle中的android节点中增加externalNativeBuild节点,如下:

我们指定cmake的配置文件为CMakeLists.txt,其位置应该在app/CMakeLists.txt

二、创建CMakeLists.txt

创建文件app/CMakeLists.txt

三、新建一个java类用于调用c++的函数

因为jni的函数声明必须和具体的类名关联,我们新建一个CUtils类来处理,新建一个CUtils.java

(Android默认的例子中都是放在MainActivity中,所以你看到的c中的函数名都是类似这样的Java_com_xxx_xx_MainActivity_func这样的)

假设我们要测试一个实现求和的jni函数,名字叫getSum,先在CUtils.java中定义对native中的引用,CUtils.java代码如下:

四、创建c++文件

选择菜单File->New->C/C++ Source File,输入名字test

五、编辑CMakeLists.txt

 

 

 

 Posted by on 2019-09-06

关于java中移位操作效率测试一例

 分类:Java, Java语言 阅读 (19)  关于java中移位操作效率测试一例已关闭评论
9月 062019
 

此场景通常是用在网络通讯中,解决数据头的时候

一般我们会约定头两个字节为某个固定值用于判断是否是有效的数据

如下代码中我们用两种方法做对比,一种是用移位操作将字节头换成int型然后比如

一种是把byte数组中的每一位进行比较

通过比较对比,比较byte数组中的每一位速度会更快。

下面是测试结果:

 

 Posted by on 2019-09-06

NDK 编译报错 SIMPLE: Error configuring

 分类:Android, Java 阅读 (21)  NDK 编译报错 SIMPLE: Error configuring已关闭评论
9月 052019
 

开发环境:Ubuntu 16.04+Android Studio 3.4.2

添加c++文件后gradle编译不过去,报SIMPLE: Error configuring错误

解决办法:

安装ninja-build

sudo apt install ninja-build

 Posted by on 2019-09-05
9月 052019
 
一、饿汉模式

饿汉模式在声明静态内部对象时就创建该对象,就是不管在程序中是否用到这个静态对象都会创建它,对于不一定会使用该对象的程序是一种资源的浪费,代码如下:

因为饿汉模式在声明的时候就创建了,所以不会有线程安全问题

二、懒汉模式

懒汉模式,即在使用的时候才去创建它,相对于饿汉他有点懒,但其实他不懒

代码如下:

假如在多个线程中都会用到这个单例对象,那么就有可能造成实例出多个对象的问题了,就是这种方式是线程不安全的

三、锁方法的懒汉模式(不推荐使用)

我们在instance()方法前加上synchronized修饰,这样多个线程就不可能同时进入instance方法了,也不会造成new多个实例的问题了

代码如下:

四、局部锁(不可使用)

这种方式看似加了一个锁,但是多个线程可能同时进入到if的判断语句中,同样不能保证_singleton的唯一性

五、双重检查锁+volatile修饰(推荐使用)

代码如下:

 

 Posted by on 2019-09-05

树莓派gpio编程(二)声控器输入

 分类:C++, Others, Others 阅读 (37)  树莓派gpio编程(二)声控器输入已关闭评论
8月 222019
 
一、编程语言

使用c语言和wiringPi库

具体见树莓派gpio编程(一)控制Led灯

二、硬件连接

对于这种开关量的传感器,一般有三个针脚VCC、GND、OUT,通常情况下连接方式如下:

vcc接树莓派引脚的3.3v

gnd接树莓派的gnd

out接树莓派gpio0

三、软件编写

新建inputtest.c,并输入以下内容

四、软件编译

使用下面的命令编译程序

五、运行程序

在控制台中输入以下命令运行程序

./inputtest

六、运行结果

当发出声音,声控器被触发的时候会输出input is 1

否则输出input is 0

七、其他说明
  1. 对于避障器、测速器等开关量的传感器都可以使用此程序读取输入
 Posted by on 2019-08-22

Java中使用ByteBuffer处理tcp粘包

 分类:Android, Java, Java语言 阅读 (36)  Java中使用ByteBuffer处理tcp粘包已关闭评论
8月 222019
 
一、通讯数据格式

通讯协议的约定格式如下:

每一个数据包的长度不固定,但是前四个字节代表的意义是固定的

数据的长度取决于第3个字段的值

名称 长度 其他说明  
协议头 2字节 固定的两个字节,用以给协议分段  
数据类型 1字节 数据内容的类型,用以区别多种内容  
数据长度 1字节 后面数据内容的长度,1字节可表示最大长度是255  
数据 n字节 n取决于上一个字节中的数值  
     
     
     
二、处理的难点
  1. 长度不固定,解析每一组数据时需要先想办法获取数据的长度
  2. 如果发送速度很快,收到一包可能有多组数据,需要一个while循环处理收到的一包的数据(这也就是粘包处理的初衷)
  3. 收到一包数据(本例中使用1024长度的缓冲区接收)可能将某个数据包截成两截,当前缓冲区未解析完的要保留下来,否则会丢数据
三、处理流程图
四、代码

在while(true)里面是读取tcp数据和进行粘包处理的代码

五、其他说明

  1. 串口通讯的粘包处理也可以使用此方法

java中的左移<<操作符

 分类:Java, Java语言 阅读 (33)  java中的左移<<操作符已关闭评论
8月 162019
 

对于正数来说,左移1位相当于这个数值翻倍,或者对于类型为int的负数来说,左移一位也是翻倍

但是对于类型小于int的类型,比如short和byte,本来以为左移并不会带符号,但经过测试不是这样的,看代码:

左移后为int型数值,本来以左移8位后,前16位会用0填充,但是没有,左移是带符号移位的,看运行结果如下:

好,我们再看看其他情况的。

1、byte为正数的情况,moveb = 2的运行结果

 

 

 Posted by on 2019-08-16

软件开发中用到的几种图

 分类:Others, Others 阅读 (23)  软件开发中用到的几种图已关闭评论
8月 152019
 

一、思维导图

二、流程图

三、DFD数据流图

四、时序图

五、UML类图

 Posted by on 2019-08-15

java中的右移>>和无符号右移>>>

 分类:Java, Java语言 阅读 (68)  java中的右移>>和无符号右移>>>已关闭评论
8月 062019
 

右移>>是指带符号右移,如果最高位的符号位为1,则右移时左侧补上的空位用1填充,否则用0填充

而无符号右移>>>,不管左侧最高位是1还是0,左侧补上的空位统统用0填充,如下面的例子:

看输出结果:

我们从第13位开始左移,即第二字节的101那里,左移后的结果如下,右侧应该有一些0用省略号代替了

101 11110100 01010100…..

我们再右移29位,即只剩下101,那么如果用>>前面将被补上很多的1,如果使用>>>,则会补很多0

 Posted by on 2019-08-06

gradle中修改生成的apk的文件

 分类:Android, Java 阅读 (26)  gradle中修改生成的apk的文件已关闭评论
8月 062019
 

在app/build.gradle中的android节点中增加如下代码:

生成的apk的文件名为myapp_debug.apk

 Posted by on 2019-08-06