文档章节

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

redstone5
 redstone5
发布于 2017/05/08 14:47
字数 1568
阅读 71
收藏 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
粉丝 3
博文 53
码字总数 38257
作品 0
玉溪
私信 提问
S5P4418开发板/真正A9四核开发板全球独家发布

REAL4418高端开发系统平台 推荐理由: 1、三星中国S5P4418开发系统国内唯一旗舰商; 2、全球绝对独家发布,独家支持3G/4G电话和短信功能;支持休眠唤醒; 3、真正的A9四核高端开发板; 4、严格...

REALARM123456
2015/05/15
1
0
用51单片机和esp8266实现通过手机app控制单片机小灯

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

brianna20022012
04/16
0
0
基于ARM双核cortex A9的开发板,安卓开发学习必备

由谷歌主导并推动的移动终端操作系统Android,由于其开源开放的特性,自发布之日起便受到全球各大IT厂商的欢迎。在各厂商的热情推动下,基于Android系统的手机、平板、智能手表等各类产品层出...

穿prada的008
2015/01/08
1K
0
做了8年的国产开源硬件

OK335xD开发板采用了TI公司的AM335X Cortex-A8处理器,运行主频最高可达1GHz,集成了1路千兆网口、CAN总线控制器、IIC控制器、LCD控制器、Power VR SGX530图形处理器,非常适合工业控制、多媒...

654945567
2013/12/19
14
0
Android实践:做一个可视频交互的智能小车

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

Agora
08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7下Tomcat启动慢的原因及解决方案

CentOS7下Tomcat启动慢的原因及解决方案 现象   在一次CentOS 7系统中安装Tomcat,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的。Tocmat的S...

linjin200
12分钟前
1
0
表格单元格td设置宽度无效的解决办法

<!--如果这样设置无效,--> <td width="120">123456789000000000000</td><!--那么套个div再设置宽度就有效了。--> <td><div style="width: 60px;overflow: hidden;text-overflow: e......

SummerGao
12分钟前
1
0
06.Beetl标签函数include ---《Beetl视频课程》

本期视频实现了评论列表分页; 内容简介:使用了标签函数include完成分页抽取 一起学beetl目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598 作者:GK 标签函数 includ...

Gavin-King
16分钟前
1
0
Valid Anagram(leetcode242)

Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: s = "anagram", t = "nagaram"Output: true Example 2: Input: s = "rat", t = ......

woshixin
18分钟前
1
0
Parameter 'loginname' not found. Available parameters are [arg1, arg0, param

原来是这样写的 @Select("select * from user where login_name=#{loginName} and password=#{password}") User findWithLoginnameAndPassword(int loginName,String password); 一直报找不到......

kuchawyz
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部