文档章节

x6818开发板安卓驱动开发(1)-LED-APP

redstone5
 redstone5
发布于 2017/05/08 14:47
字数 1568
阅读 65
收藏 0

需要使用JNI来对LED控制。参考https://developer.android.google.cn/studio/projects/add-native-code.html?hl=zh-cn#new-project

下载 NDK 和构建工具

使用 SDK 管理器安装这些组件:

  1. 在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。
  2. 点击 SDK Tools 标签。
  3. 选中 LLDBCMake 和 NDK 旁的复选框。

创建新项目

创建项目与创建任何其他 Android Studio 项目类似。在向导的 Configure your new project 部分选中 Include C++ Support 复选框。

创建新的c/c++源文件

  1. 从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图。
  2. 导航到 app> src,右键点击 main 目录,然后选择 New > Folder>JNI Folder
  3. 右键点击您刚刚创建的目录,然后选择 New > C/C++ Source File
  4. 为源文件输入一个名称 x6818Led.c。

创建 CMake 构建脚本

如果原生源文件还没有 CMake 构建脚本,则需要自行创建一个并包含适当的 CMake 命令。CMake 构建脚本是一个纯文本文件,您必须将其命名为 CMakeLists.txt。用于在创建原生库时指示 CMake 应使用哪些源文件。

可以在任意位置创建(不过,在配置构建脚本时,原生源文件和库的路径将与构建脚本的位置相关),本文在工程根目录下创建。

  1. 从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图
  2. 右键点击根目录并选择 New > File
  3. 输入“CMakeLists.txt”作为文件名并点击 OK

现在,可以添加 CMake 命令,对您的构建脚本进行配置。要指示 CMake 从原生源代码创建一个原生库,将 cmake_minimum_required() 和 add_library() 命令添加到构建脚本中:

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             x6818led-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             app/src/main/jni/x6818Led.c)

为了确保 CMake 可以在编译时定位到头文件,需要使用 include_directories() 命令,并包含头文件的路径:

# Specifies a path to native header files.
include_directories(app/src/main/jni/)

要将预构建库关联到自己的原生库,请将其添加到 CMake 构建脚本的 target_link_libraries() 命令中:

target_link_libraries( # Specifies the target library.
                       x6818led-lib)

在构建应用时,Gradle 会自动将导入的库打包到 APK 中。可以使用 APK 分析器验证 Gradle 将哪些库打包到的 APK 中。

将 Gradle 关联到原生库

要将 Gradle 关联到您的原生库,您需要提供一个指向 CMake 或 ndk-build 脚本文件的路径。在您构建应用时,Gradle 会以依赖项的形式运行 CMake 或 ndk-build,并将共享的库打包到您的 APK 中。Gradle 还使用构建脚本来了解要将哪些文件添加到您的 Android Studio 项目中,以便您可以从 Project 窗口访问这些文件。如果您的原生源文件没有构建脚本,则需要先创建 CMake 构建脚本,然后再继续。

将 Gradle 关联到原生项目后,Android Studio 会更新 Project 窗格以在 cpp 组中显示您的源文件和原生库,在 External Build Files 组中显示您的外部构建脚本。

:更改 Gradle 配置时,请确保通过点击工具栏中的 Sync Project  应用更改。此外,如果在将 CMake 或 ndk-build 脚本文件关联到 Gradle 后再对其进行更改,您应当从菜单栏中选择 Build > Refresh Linked C++ Projects,将 Android Studio 与您的更改同步

使用 Android Studio UI

您可以使用 Android Studio UI 将 Gradle 关联到外部 CMake 或 ndk-build 项目:

  1. 从 IDE 左侧打开 Project 窗格并选择 Android 视图。
  2. 右键点击想要关联到原生库的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle。应看到一个如图 4 所示的对话框。
  3. 从下拉菜单中,选择 CMake 或 ndk-build。选择 CMake,请使用 Project Path 旁的字段为您的外部 CMake 项目指定 CMakeLists.txt 脚本文件。

手动配置 Gradle

要手动配置 Gradle 以关联到您的原生库,您需要将 externalNativeBuild {} 块添加到模块级 build.gradle 文件中(注意不是工程根目录下的build.gradle),并使用 cmake {} 或 ndkBuild {}对其进行配置(注意CMakeLists.txt相对于build.gradle的位置):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "23.0.1"
    defaultConfig {...}
    buildTypes {...}
    externalNativeBuild {
        cmake {
            path '../CMakeLists.txt'
        }
    }
}

指定 ABI

默认情况下,Gradle 会针对 NDK 支持的 ABI 将原生库构建到单独的 .so 文件中,并将其全部打包到APK 中。如果希望 Gradle 仅构建和打包原生库的特定 ABI 配置,您可以在模块级 build.gradle 文件中(注意不是工程根目录下的build.gradle)使用 ndk.abiFilters 标志指定这些配置,如下所示:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "23.0.1"
    defaultConfig {
        ...
        ndk {
            // Specifies the ABI configurations of your native
            // libraries Gradle should build and package with your APK.
            abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
    }
    buildTypes {...}
    externalNativeBuild {...}
}

创建LED类

导航到 app> src>main>java 目录,右键点击包名com.wuzs.x6818apptest ,然后选择 New >java class 创建一个类名为LED的类。

Led.java:

package com.wuzs.x6818apptest;

/**
 * Created by WZS82 on 2017/5/8.
 */

public class Led {
    static {
        System.loadLibrary("x6818led-lib");
    }
    public native int getLedNunmber();
    public native boolean getLedStatus(int no);
    public native boolean setLedOn(int no);
    public native boolean setLedOff(int no);
}

实现JNI调用

注意c函数名与java类的关系。

x6818Led.c

//
// Created by WZS82 on 2017/5/8.
//
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

JNIEXPORT jint JNICALL
Java_com_wuzs_x6818apptest_Led_getLedNunmber(JNIEnv *env, jobject instance)
{
    return 4;
}
JNIEXPORT jboolean JNICALL
Java_com_wuzs_x6818apptest_Led_getLedStatus(JNIEnv *env, jobject instance, jint no)
{
    if(no < 1 || no > 4)   return 0;
    char file[50];
    char buf[4];
    sprintf(file, "/sys/devices/platform/x6818-leds/led%d",no);
    int fd  = open(file,O_RDWR);
    int ret = read(fd,buf, 4);
    close(fd);
    return (buf[0] == '1') ? 1  :0;
}
JNIEXPORT jboolean JNICALL
Java_com_wuzs_x6818apptest_Led_setLedOn(JNIEnv *env, jobject instance, jint no)
{
    if(no < 1 || no > 4)   return 0;
    char file[50];
    sprintf(file, "/sys/devices/platform/x6818-leds/led%d",no);
    int fd  = open(file,O_RDWR);
    int ret = write(fd,"1", 2);
    close(fd);
    return (ret == 0) ? 1  :0;
}
JNIEXPORT jboolean JNICALL
Java_com_wuzs_x6818apptest_Led_setLedOff(JNIEnv *env, jobject instance, jint no)
{
    if(no < 1 || no > 4)   return 0;
    char file[50];
    sprintf(file, "/sys/devices/platform/x6818-leds/led%d",no);
    int fd  = open(file,O_RDWR);
    int ret = write(fd,"0", 2);
    close(fd);
    return (ret == 0) ? 1  :0;
}

至此所有配置结束,工程目录如下所示:

 

© 著作权归作者所有

共有 人打赏支持
redstone5
粉丝 2
博文 49
码字总数 37304
作品 0
玉溪
用51单片机和esp8266实现通过手机app控制单片机小灯

这篇文章我在51黑电子论坛也发过,在这里再发一次。是自己在比赛的时候要使用这个esp8266模块,去查资料了解后,自己摸出来的方法。 用51单片机和esp8266实现通过手机app控制单片机小灯,也可...

brianna20022012
04/16
0
0
Android实践:做一个可视频交互的智能小车

本文的三位作者正阳、海洋、阿力,是来自不同公司的工程师,在Agora RTC Hack 上海站编程马拉松上,开发了一款可实时视频远程看房的智能小车。本文将从方案设计、硬件开发、Android 端开发、...

Agora
08/01
0
0
介绍TTC CC2541 SDK 蓝牙4.0开发套件

简介 TTC CC2541 SDK 是由我司针对TI的CC2541芯片开发提供的快速开发工具。旨在让开发人员不再需要将大量精力放在蓝牙调试方面,只需将精力放在对CC2541芯片功能的应用开发上。 TTC CC2541 S...

昇润科技
05/21
0
0
AndroidThings之基础一 基本概念

转载自:https://blog.csdn.net/weixin41636248/article/details/79069994 Android Things是什么 一句话说,AndroidThings就是让开发者可以使用Android开发工具开发嵌入式设备。 If you can...

qq_28831197
05/09
0
0
Android LED(NDK)

开发工具: Eclipse 开发语言: Java、C 拿到pcDuino很久了,因为太忙一直没有用过。最近把原版的ubuntu换成了Android,以前自学过Android App,但没有操作底层资源的经验。通过借鉴 “shina...

simpower
2014/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

以太坊总结

一、概念说明 1.以太坊(Ethereum blockchain)由V神(Vitalik Buterin)发明,是一个交易记录的永久数据库,它以一个“无信任”的交易系统来运行,不需要任何第三方信任机构即可进行点对点的...

盼望明天
33分钟前
1
0
Java并发工具类——AtomicInteger

基本类型int的递增等操作并不是线程安全的,加上synchronized又会影响性能,因此在并发情况下我们应该使用AtomicInteger,下面通过一个例子验证一哈。 public class TestAtomicInteger {...

东都大狼狗
35分钟前
1
0
基于CentOS7.2系统对RabbitMQ单机版安装过程

准备虚拟机系统 我的系统如下 系统版本7.2 安装perl yum install perl 安装wget工具 yum install -y wget 安装相关依赖工具 yum install ncurses ncurses-base ncurses-devel ncurses-libs ...

凌晨一点
39分钟前
1
0
Maven常用命令

Maven常用命令 说到命令,则不得不提一下环境变量,在之前的博文中简单提了一下环境变量的配置,这里具体说一下。说完环境变量的配置,然后就是Maven的常用命令,这里说的是常用的几个命令,...

星汉
55分钟前
0
0
Flink操作mysql kafka和hbase

主程序 package com.streaming.flink;import java.util.Properties;import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.common.functi......

守望者之父
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部