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

需要使用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;
}

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

161224_hQ5T_3472252.png161328_cauJ_3472252.png

 

转载于:https://my.oschina.net/u/3472252/blog/894874

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于粤嵌gec6818开发板的小游戏有五子棋、2048游戏、扫雷、飞机大战、钢琴游戏、刮刮乐等。这些小游戏都可以通过简单的程序设计和硬件驱动来实现。 五子棋是一种简单而又经典的棋类游戏,玩家通过下棋子来争夺胜利。通过gec6818的触摸屏幕输入,可以实现玩家与电脑的对战,或者两个玩家之间的互动。 2048游戏是一款数学益智类游戏,玩家通过上下左右的滑动操作,将相同数值的方块合并,最终得到2048这个数值的方块。通过gec6818的触摸屏幕输入,可以实现玩家的滑动操作,将方块进行合并。 扫雷是一款经典的益智类游戏,玩家通过点击格子,来揭示隐藏的雷,避免踩雷。通过gec6818的触摸屏幕输入,可以实现玩家的点击操作,将雷揭示出来。 飞机大战是一款横版射击游戏,玩家通过控制飞机,射击敌方飞机和敌方炮台,躲避敌方的攻击。通过gec6818的按键输入,可以实现玩家的控制操作,进行射击和躲避。 钢琴游戏是一款音乐类游戏,玩家通过按下不同的琴键,发出不同的音符,弹奏出美妙的音乐。通过gec6818的按键输入,可以实现玩家的按键操作,发出不同的音符。 刮刮乐是一种益智类游戏,玩家通过刮开卡片上的涂层,获得隐藏的奖品。通过gec6818的触摸屏幕输入,可以实现玩家的刮卡操作,揭开涂层,看到奖品。 以上这些游戏都是基于粤嵌gec6818开发板所设计的,通过合理的硬件和软件开发,可以让人们在休闲娱乐中享受到游戏乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值