您的位置:首页 > 移动开发

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

下载 NDK 和构建工具

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

在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。

点击 SDK Tools 标签。

选中 LLDBCMakeNDK 旁的复选框。

创建新项目

创建项目与创建任何其他 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 所示的对话框。

从下拉菜单中,选择 CMakendk-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;
}

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JNI x6818开发板 安卓