东城青年
非宁静无以致远
微信号:15221816820
展开
-
Android程序崩溃定位
Crash:程序在执行过程中,由于一些未知问题经常会带来程序崩溃、闪退等现象,这是由于代码中出现了一些类似数组越界、访问非法内存等问题造成的。为了高效解决问题,我们首先需要快速定位到问题的位置。add2line:add2line是一个可以将指令的地址转换为源代码行数的工具。当可执行文件在内核执行过程中出现崩溃时,可用于快速定位出错的位置,进而找出代码的bug。Android程序Crash定位步骤:1.安装NDK并配置环境变量。通过androidstudio软件下载ndk,首先原创 2024-07-01 17:22:05 · 89 阅读 · 0 评论 -
OpenCV-android-sdk配置及使用(NDK)
如果将编译选项OPENCV_LIB_TYPE改成静态链接式编译,则会直接将需要的代码编译到当前模块,此时运行可执行文件时就不需要libopencv_java4.so了。打开Windows PowerShell命令行窗口,在jni文件夹路径下执行ndk-build命令,会生成libs文件夹,编译好的模块会生成在该文件夹内。opencv官网下载Android版。原创 2024-05-11 14:13:58 · 183 阅读 · 2 评论 -
apk中读写驱动节点
【代码】apk中读写驱动节点。原创 2023-05-22 15:21:35 · 154 阅读 · 0 评论 -
vendor分区的库无法调用system分区的库
vendor分区的库无法调用system分区的库原创 2022-10-10 18:07:10 · 4091 阅读 · 2 评论 -
AudioTrack使用文档
构造函数new AudioTrack(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes, int mode, int sessionId); 1. AudioAttributes(设置音频属性)setUsage()音频用途:比如是要作为音乐播放,还是手机导航语音播放,还是作为收到消息的提示音使用等。 AudioAttributes.USAGE_MEDIA AudioAttributes.U...原创 2022-05-23 20:38:27 · 456 阅读 · 1 评论 -
GridLayout布局实现计算器界面
GridLayout(网格布局)可以自己设置布局中组件的排列方式 可以自定义网格布局有多少行,多少列 可以直接设置组件位于某行某列 可以设置组件横跨几行或者几列用法归纳:ep 1:先定义组件的对其方式 android:orientation 水平或者竖直,设置多少行与多少列 step 2:设置组件所在的行或者列,记得是从0开始算的,不设置默认每个组件占一行一列 step 3:设置组件横跨几行或者几列;设置完毕后,需要在设置一个填充:android:layout_gravity = "f.原创 2021-12-17 11:09:54 · 1877 阅读 · 0 评论 -
TableLayout布局实现登录界面
确定行列数如果我们直接往TableLayout中添加组件的话,那么这个组件将占满一行 如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面 tablerow中的组件个数就决定了该行有多少列,而列的宽度由该列中最宽的单元格决定三个常用属性android:collapseColumns:设置需要被隐藏的列的序号 android:shrinkColumns:设置允许被收缩的列的列序号 android:stretchColumns:设置运行被拉伸的列的列序号.原创 2021-12-14 14:59:30 · 2380 阅读 · 1 评论 -
ViewPager实现翻页功能
1.托一个LinearLayout布局,在该布局中创建一个带下划线标题的ViewPager控件;<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/r原创 2021-12-13 17:07:41 · 1675 阅读 · 0 评论 -
apk实现圆弧进度动画
1.新建CircleAnimation.java类:package com.example.viewpager_test;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.view.View;import android.widget.RelativeLayout;原创 2021-12-10 17:24:00 · 958 阅读 · 0 评论 -
apk获取屏幕分辨率
获取屏幕分辨率,即像素px: public static Point getSizeScreen(Context ctx) { WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm);.原创 2021-12-10 14:47:12 · 379 阅读 · 0 评论 -
apk弹出对话框
1.先定义弹出框界面布局create_user_dialog.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/create_user_dialog_view" android:layout_width="fill_parent" android:lay原创 2021-10-13 23:27:30 · 273 阅读 · 0 评论 -
HIDL服务实现
HIDL设计HIDL设计的目的是想把Framework层与Hal层进行隔离,使Framework层可以直接被覆盖更新,而不需要重新对HAL层进行编译。HAL的部分将会放在/vendor分区中,并且由设备供应商或SOC制造商来构建,这使得Framework部分可以通过OTA方式更新,同时不需要重新编译HAL。 之前将打开库hw_get_module等调用Hal层操作放在JNI服务中(Framework里的Native层),现在将这些操作放在HIDL服务里,然后在JNI服务...原创 2021-09-13 11:50:11 · 414 阅读 · 1 评论 -
开机自动关闭SELinux权限
init进程是Android内核启动的第一个用户进程,其中的SELinux也是在init进程中启动的,代码位置在system/core/init/init.cpp中。通过代码我们可以看出,初始化时会通过security_getenforce()和selinux_is_enforcing()的值是否一致来判断是否开启SELinux,当不一致的时候会设置security_setenforce的值为is_enforcing。security_getenforce()是读取驱动节点enforce,节点.原创 2021-09-09 17:45:56 · 485 阅读 · 1 评论 -
apk中执行可执行程序
我上篇博客中编译可执行文件编译出了可执行文件addValTest如何在apk中执行该可执行文件:Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例;通过Process对象实例可以控制该子进程的执行或获取该子进程的信息;process.waitfor()的目的是等待子进程完成再往下执行; try { //..原创 2021-09-09 15:17:30 · 578 阅读 · 1 评论 -
so库的编译及调用
1.编写接口函数addVal.cpp#include "stdio.h"int addVal(int a, int b) { return a + b;}编写Android.mk,Application.mk将接口函数编译成so库文件Android.mkLOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libAddValLOCAL_SRC_FILES := main.cppinclu.原创 2021-09-09 13:46:08 · 723 阅读 · 1 评论 -
打通apk到hal层
HAL代码结构:三个结构体,两个常量,一个函数,简称321架构。app(应用层代码) service(framework层,此层是给应用层提供服务的) JNI(java不能访问c/cpp,所以就得使用这个,jni中的c/cpp文件编译后会生成一个.so库) HAL(jni会调用hal中的interface,hal中的代码编译后也会生成一个.so库) device&driver(硬件设备)///////////////////////////////////////////////.原创 2021-09-01 10:10:51 · 1204 阅读 · 1 评论 -
JNI读写驱动节点
上一章已经介绍了JNI基础开发,这一章主要介绍一下通过JNI调用unix的读写函数(C语言),读写底层驱动节点。1.在新建类中添加native方法声明: public native int write_node_file(String file_name, String value); public native String read_node_file(String file_name, int read_byte_nums);2.生成头文件后在cpp文件中开始实现: 写节点:.原创 2021-07-08 15:27:12 · 475 阅读 · 1 评论 -
基于蓝牙的无线通信
添加权限: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <us原创 2021-07-07 14:11:42 · 345 阅读 · 1 评论 -
JNI基础开发
JNI全称Java Native Interface。它为Java与本C/C++之间提供了一种交互方式。用途:用来快速调用C/C++动态库。1.新建一个Java类package com.example.androidtestjni;public class MyJni { // 以下native方法在C/C++中实现 public native int testHello(int a, int b); public native static String g.原创 2021-06-30 16:12:03 · 130 阅读 · 0 评论 -
基于socket的多客户端之间互相通信
服务端循环监听客户端,为每一个连接的客户端创建一个子线程,并将线程添加到一个集合列表中; 子线程中将消息以json的格式进行封装并添加到一个集合列表中; 创建一个线程用于消息的解析与转发; 客户端新建Socket并指定服务端ip和端口号进行连接; 客户端发送的消息开头加上消息到达方的id,用斜杠或其他特殊符号区分开;public class ServerHost { // 消息列表 static List mMsgList = new ArrayList(); // 线程原创 2021-06-30 15:21:15 · 671 阅读 · 0 评论 -
基于socket的wifi通信
客户端服务端新建一个ServerSocket,再调用accept()方法监听客户端的连接,在连接之前,此方法一直阻塞,连接成功后,返回客户端一样的socket; 客户端新建Socket,指定服务端ip和端口号进行连接; 连接成功后,服务端客户端之间就可以相互发送数据了;服务端类public class SocketServer { ServerSocket serverSocket = null; Socket socket = null; DataInputStream原创 2021-06-30 14:54:08 · 1318 阅读 · 1 评论