x6818开发板安卓驱动开发(1)-LED-APP
x6818开发板安卓驱动开发(1)-LED-APP
redstone5 发表于5个月前
x6818开发板安卓驱动开发(1)-LED-APP
  • 发表于 5个月前
  • 阅读 46
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

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

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

 

共有 人打赏支持
粉丝 3
博文 22
码字总数 37304
×
redstone5
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: