3-安卓底层-实现安卓控制LED

安卓源码目录:

abi     bootable  dalvik       device    frameworks  libnativehelper  ndk       pdk        system
art     build     developers   docs      hardware    Makefile         out       prebuilts
bionic  cts       development  external  libcore     modules          packages  sdk
  • build :
  • build 目录中存放的是编译系统mk文件,编译规则和generic产品基础配置文件
  • device :
  • device 是和设备平台先关的代码 比如传感器的hal camera 的hal 代码
  • frameworks :
  • frameworks 核心框架——java及C++语言,是Android应用程序的框架
  • system :
  • system Android根文件系统相关源码,如:init、adb、toolbox及一些库
  • out :
  • out 输出文件的目录
  • external
  • external Android使用的一些开源的模块代码

* 重要 : device frameworks hardware


1.配置

配置编译android环境分为以下几部

source build/envsetup.sh 配置环境变量加载分支

2.选择分支

lunch 选择分支

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. fspad_733-eng
     8. fspad_733-user

Which would you like? [aosp_arm-eng] 7

PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0  android 版本号
TARGET_PRODUCT=fspad_733 厂家产品
TARGET_BUILD_VARIANT=eng android 发行类别
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm 平台
TARGET_ARCH_VARIANT=armv7-a-neon 平台架构
TARGET_CPU_VARIANT=cortex-a7 硬件编号
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64 宿主机
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.16.0-30-generic-x86_64-with-Ubuntu-14.04-trusty 宿主机内核版本
HOST_BUILD_TYPE=release
BUILD_ID=LRX21V
OUT_DIR=out  指定的输出目录
3.编译android源码

make 编译android源码

Android.mk
  • m编译全部
  • mm只编译当前目录
  • mmm编译指定目录
1 LOCAL_PATH := $(call my-dir) 获得androidmk路径
2 include $(CLEAR_VARS) 清空除了 local_path 之外的环境变量
3 LOCAL_MODULE := test 要生成的目标
4 LOCAL_SRC_FILES := test.c 目标依赖的源文件
5 LOCAL_MODULE_TAGS := eng    发行类型
6 include $(BUILD_EXECUTABLE) 生成的目标文件的类型
发行类型

user: 指该模块只在user版本下才编译

eng: 指该模块只在eng版本下才编译

tests: 指该模块只在tests版本下才编译

optional:指该模块在所有版本下都编译

一般的我们这样定义存放文件的目录的名字

  • 源代码 src 头文件 inc 可执行程序 bin 库 lib

adb 工具的使用

DOS 命令与linux命令 :
windows linux
cd cd 切换路径
dir ls 查看当前路径
del rm 删除
cp cp 拷贝
d: 进入D盘

1.解压 fastboot 到D盘根目录下

2.通过 dos终端 进入fastboot 目录下

3.在fastboot 目录下 执行 adb devices 列出已连接的所有设备串号

4.adb shell 进入android 后台终端

5.exit 退出终端

adb push test /data 从window 上传到 android

adb pull /data/test 从android 下载到 windows

打印log信息的函数原型与使用
int __android_log_print(int prio, const char *tag,  const char *fmt, ...)

typedef enum android_LogPriority {
 80     ANDROID_LOG_UNKNOWN = 0,
 81     ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */
 82     ANDROID_LOG_VERBOSE,
 83     ANDROID_LOG_DEBUG,
 84     ANDROID_LOG_INFO,
 85     ANDROID_LOG_WARN,
 86     ANDROID_LOG_ERROR,
 87     ANDROID_LOG_FATAL,
 88     ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */
 89 } android_LogPriority;

//要包含 #include<android/log.h>
 __android_log_print(ANDROID_LOG_INFO, "aaaaaaa" , "******fd = %d",fd);

//mk文件必须要加liblog系统库
1 LOCAL_PATH := $(call my-dir)
2 include $(CLEAR_VARS)
3 LOCAL_MODULE:= libnative
4 LOCAL_SRC_FILES:= src/native.c
5 LOCAL_MODULE_TAGS:= eng
6 LOCAL_SHARED_LIBRARIES:= liblog      当使用android 系统库是使用   LOCAL_SHARED_LIBRARIES 来指定使用库的名称
7 LOCAL_MODULE_PATH:= $(LOCAL_PATH)/lib
8 include $(BUILD_SHARED_LIBRARY)

实现安卓应用控制LED

  1. 写jni 将iboled.c 生成 libiboled.so 上传到 android 平板的 /system/lib 目录下
  • 如果出现 /system/lib 只读则执行:mount -o rw,remount -t ext4 /dev/block/by-name/system
  1. 写一个安卓应用 , 调用jni方法。

iboled.c

#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>

#define LED_OFF _IO('k',0)
#define LED_ON  _IO('k',1)

int fd;

jint Jopen(JNIEnv *env,jobject obj,jstring dev){
    const jbyte *str;
    str = (*env)->GetStringUTFChars(env, dev, NULL);
    if (str == NULL) return -1;

    fd = open(str,O_RDWR);
    if (fd < 0) {
        __android_log_print(ANDROID_LOG_INFO, "openFailed", "openFailed %d \n",fd);
        return -1;
    }else{
        __android_log_print(ANDROID_LOG_INFO, "openSeccus", "openSeccus %d \n",fd);
    }

    return fd;
}
void Jioctl(JNIEnv *env,jobject obj,jint cmd){
    if (cmd == 1) ioctl(fd,LED_ON);
    else ioctl(fd,LED_OFF);
    __android_log_print(ANDROID_LOG_INFO, "ioctl", "cmd = %d \n",cmd);
    return;
}
void Jclose(JNIEnv *env,jobject obj){
    close(fd);
    return;
}

JNINativeMethod methods[]={
    "open","(Ljava/lang/String;)I",(void *)Jopen,
    "close","()V",(void *)Jclose,
    "ioctl","(I)V",(void *)Jioctl,
};

JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved){
    JNIEnv *env;
    jclass cls;

    (*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2);
    if(env == NULL) return JNI_ERR;

    cls = (*env)->FindClass(env, "com/ibo/jnidemo/TestJni");
    if(cls == NULL) return JNI_ERR;

    (*env)->RegisterNatives(env, cls,methods, sizeof(methods)/sizeof(JNINativeMethod));

    return JNI_VERSION_1_2;
}

Android.mk

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=libiboled
LOCAL_SRC_FILES :=src/iboled.c
LOCAL_MODULE_TAGS :=eng
LOCAL_SHARED_LIBRARIES :=liblog
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/lib
include $(BUILD_SHARED_LIBRARY)

1.写完 Android.mk 之后 执行 mm 生成 libiboled.so

2. libiboled.so 复制到 fastboot 根目录

3.执行 adb push libiboled.so system/lib 上传到 android 平板的 /system/lib 目录下

TestJni.java

package com.ibo.jnidemo;

class TestJni{
    static{
        System.loadLibrary("iboled");
    }

    public native int open(String dev);
    public native void close();
    public native void ioctl(int cmd);
}

MainActivity.java

package com.ibo.jnidemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn;
    boolean isLight = false;
    private TestJni ibo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ibo = new TestJni();
        int open = ibo.open("/dev/led");
        if (open<0){
            System.out.println("####  open error ! "+open);
            return;
        }

        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }

    @Override
    protected void onDestroy() {
        ibo.ioctl(0);
        ibo.close();
        super.onDestroy();
    }

    @Override
    public void onClick(View v) {
        if (isLight){
            isLight=false;
            ibo.ioctl(0);
            btn.setText("on");
        }else{
            isLight=true;
            ibo.ioctl(1);
            btn.setText("off");
        }
    }
}

4.运行,完成了~

结束


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容