x6818开发板安卓驱动开发(1)-LED-APP
2017-05-08 00:00
239 查看
需要使用JNI来对LED控制。参考https://developer.android.google.cn/studio/projects/add-native-code.html?hl=zh-cn#new-project
在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。
点击 SDK Tools 标签。
选中 LLDB、CMake 和 NDK 旁的复选框。
导航到 app> src,右键点击 main 目录,然后选择 New > Folder>JNI Folder
右键点击您刚刚创建的目录,然后选择 New > C/C++ Source File
为源文件输入一个名称 x6818Led.c。
可以在任意位置创建(不过,在配置构建脚本时,原生源文件和库的路径将与构建脚本的位置相关),本文在工程根目录下创建。
从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图
右键点击根目录并选择 New > File
输入“CMakeLists.txt”作为文件名并点击 OK
现在,可以添加 CMake 命令,对您的构建脚本进行配置。要指示 CMake 从原生源代码创建一个原生库,将
为了确保 CMake 可以在编译时定位到头文件,需要使用
要将预构建库关联到自己的原生库,请将其添加到 CMake 构建脚本的
在构建应用时,Gradle 会自动将导入的库打包到 APK 中。可以使用 APK 分析器验证 Gradle 将哪些库打包到的 APK 中。
将 Gradle 关联到原生项目后,Android Studio 会更新 Project 窗格以在 cpp 组中显示您的源文件和原生库,在 External Build Files 组中显示您的外部构建脚本。
注:更改 Gradle 配置时,请确保通过点击工具栏中的 Sync Project
应用更改。此外,如果在将 CMake 或 ndk-build 脚本文件关联到 Gradle 后再对其进行更改,您应当从菜单栏中选择 Build > Refresh Linked C++ Projects,将 Android Studio 与您的更改同步
从 IDE 左侧打开 Project 窗格并选择 Android 视图。
右键点击想要关联到原生库的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle。应看到一个如图 4 所示的对话框。
从下拉菜单中,选择 CMake 或 ndk-build。选择 CMake,请使用 Project Path 旁的字段为您的外部 CMake 项目指定
Led.java:
x6818Led.c
至此所有配置结束,工程目录如下所示:
下载 NDK 和构建工具
使用 SDK 管理器安装这些组件:在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。
点击 SDK Tools 标签。
选中 LLDB、CMake 和 NDK 旁的复选框。
创建新项目
创建项目与创建任何其他 Android Studio 项目类似。在向导的 Configure your new project 部分不选中 Include C++ Support 复选框。创建新的c/c++源文件
从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图。导航到 app> src,右键点击 main 目录,然后选择 New > Folder>JNI Folder
右键点击您刚刚创建的目录,然后选择 New > C/C++ Source File
为源文件输入一个名称 x6818Led.c。
创建 CMake 构建脚本
如果原生源文件还没有 CMake 构建脚本,则需要自行创建一个并包含适当的 CMake 命令。CMake 构建脚本是一个纯文本文件,您必须将其命名为CMakeLists.txt。用于在创建原生库时指示 CMake 应使用哪些源文件。
可以在任意位置创建(不过,在配置构建脚本时,原生源文件和库的路径将与构建脚本的位置相关),本文在工程根目录下创建。
从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图
右键点击根目录并选择 New > File
输入“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 项目:从 IDE 左侧打开 Project 窗格并选择 Android 视图。
右键点击想要关联到原生库的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle。应看到一个如图 4 所示的对话框。
从下拉菜单中,选择 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; }
至此所有配置结束,工程目录如下所示:
相关文章推荐
- x6818开发板安卓驱动开发(1)-LED-driver
- 安卓LED驱动开发体验
- 安卓驱动开发之-(一)LED初体验
- 基于全志A33的LED驱动开发,安卓6.0.1平台
- 手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- mini2440 LED设备驱动开发源代码(宋宝华框架)
- 控制LED灯的流驱动开发文档
- platform_driver与file_operations两种方法开发led驱动
- 【转】嵌入式Linux之我行——LED驱动在2440上的实例开发
- ARM裸板驱动开发之LED驱动
- 对mini2440LED灯驱动开发
- Linux驱动开发之S3C2440按键点亮LED
- Linux设备驱动开发基础---字符设备驱动程序开发之mini2440_LED驱动
- 【嵌入式linux】(第六步):使用eclipse集成开发环境开发第一个嵌入式Linux程序,并测试LED驱动
- platform_driver与file_operations两种方法开发led驱动
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- 领域驱动开发推荐代码示例 — Microsoft NLayerApp
- Linux驱动开发之S3C2440按键点亮LED
- “手把手教你学linux驱动开发”OK6410系列之02---LED字符设备驱动 .
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动