1 APP应用程序调用HardControl.java类中的方法

2.1 HardControl.java类中的方法通过系统调用System.loadLibrary("hardcontrol")来加载C库

public class HardControl {static {try {System.loadLibrary("hardcontrol");} catch (Exception e) {e.printStackTrace();}}
}

2.2 HardControl.java类申明native本地方法供app java应用程序调用

public class HardControl {public static native int ledCtrl(int which, int status);public static native int ledOpen();public static native void ledClose();
}

3 C库实现对应硬件的控制(open,read,write)

HardControl.java类中申明的native本地方法通过JNI将HardControl.c中实现的本地函数关联起来

HardControl.java                      《==========》               HardControl.c

申明native本地方法                                                          实现并注册对应的native函数

App应用程序

1.将申明本地方法的java类导入进来

import com.thisway.hardlibrary.*;

2.new申明native的类

一旦该类被使用,则该类的静态块static{}就会被调用

HardControl.java类中静态块代码通过系统调用System.loadLibrary("hardcontrol")来加载C库

如何加载C库:

2.1 将HardControl.c编译成so动态库

2.2 将生产的动态库HardControl.so编译进apk,或者放到/vendor/lib或者/system/lib路径下

如何将动态库编译进apk

2.2.1 将动态库HardControl.so文件放到app工程路径下的app/libs/armeabi/路径下

2.2.2 然后编译生成apk文件

HardControl hardcontorl = new HardControl();

3.调用类里面申明的native方法

MainActivityApp.java

import xxx.xx.x

HardControl.java

package com.thisway.hardlibrary;public class HardControl {public static native int ledCtrl(int which, int status);public static native int ledOpen();public static native void ledClose();static {try {System.loadLibrary("hardcontrol");} catch (Exception e) {e.printStackTrace();}}}

HardControl.c

在系统调用加载C库的时候会调用JNI_OnLoad(JavaVM *jvm, void *reserved)

通过(*env)->FindClass(env, "com/thisway/hardlibrary/HardControl")找到对应加载它的类

通过(*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0])

将类中申明的方法同C库中实现的函数关联起来


#include <jni.h>  /* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>#include <android/log.h>  /* liblog *///__android_log_print(ANDROID_LOG_DEBUG, "JNIDemo", "native add ...");#if 0
typedef struct {char *name;          /* Java里调用的函数名 */char *signature;    /* JNI字段描述符, 用来表示Java里调用的函数的参数和返回值类型 */void *fnPtr;          /* C语言实现的本地函数 */
} JNINativeMethod;
#endifstatic jint fd;jint ledOpen(JNIEnv *env, jobject cls)
{fd = open("/dev/leds", O_RDWR);__android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledOpen : %d", fd);if (fd >= 0)return 0;elsereturn -1;
}void ledClose(JNIEnv *env, jobject cls)
{__android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledClose ...");close(fd);
}jint ledCtrl(JNIEnv *env, jobject cls, jint which, jint status)
{int ret = ioctl(fd, status, which);__android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledCtrl : %d, %d, %d", which, status, ret);return ret;
}static const JNINativeMethod methods[] = {{"ledOpen", "()I", (void *)ledOpen},{"ledClose", "()V", (void *)ledClose},{"ledCtrl", "(II)I", (void *)ledCtrl},
};/* System.loadLibrary */
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *jvm, void *reserved)
{JNIEnv *env;jclass cls;if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_4)) {return JNI_ERR; /* JNI version not supported */}cls = (*env)->FindClass(env, "com/thisway/hardlibrary/HardControl");if (cls == NULL) {return JNI_ERR;}/* 2. map java hello <-->c c_hello */if ((*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0])) < 0)return JNI_ERR;return JNI_VERSION_1_4;
}

Android APP通过JNI直接访问硬件框架相关推荐

  1. Android App Bundles(谷歌官方动态化框架)

    提纲 是什么(Android App Bundles简介) 为什么使用(aab的四个新功能及实用性) 怎么使用(怎么进行aab的改造) 怎么测试(可以通过google市场测试 而本文主要介绍aab本地 ...

  2. Android系统硬件访问服务框架分析

    怎么实现硬件访问服务 1.JNI和HAL com_andorid_server_ledService.cpp (JNI文件注册JNI本地方法:供app应用程序调用) hal_led.c (C库:具体操 ...

  3. Android硬件访问服务框架思想初识

    Android的硬件访问服务提供了一个APP调用硬件实现的方法模型.我们从上往下来看.应用层面对的都是一个个的服务叫service.比如电源管理服务,震动服务等等.应用层代码首先就需要去查询系统是否存 ...

  4. android+硬件服务,android之硬件访问服务框架

    一.硬件接口描述文件aidl 新增\frameworks\base\core\java\android\os\ILedService.aidl 二.mk编译脚本 修改vi frameworks/bas ...

  5. 嵌入式Android底层开发(三)硬件访问服务框架

    一.简单的Android应用程序调用硬件流程图(通过JNI接口直接访问) 但这样存在一个很大的问题:访问仅限与单一程序进行访问,如果多个APP同时访问一个硬件资源(多个APP都需要在LCD进行显示.多 ...

  6. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 6...

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  7. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  8. Android APP如何简单快速实现控制硬件设备并实现APP签名

    Android APP如何简单快速实现控制硬件设备 driver(C)层 硬件控制 节点的创建 APP(java)层 native(C/C++)层 接下来上干货,重点说说实现流程 Android st ...

  9. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法...

    在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了"错误: 无法访问android.app.Activity 找不到android.app.Act ...

最新文章

  1. Contextualization
  2. Qt Creator配置项目
  3. RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1)
  4. R语言与数据的概括性度量
  5. css x轴不滚动_css – 固定div,动态内容不滚动
  6. idea下拉项目_推荐几款非常好用的IDEA插件(香)
  7. 额度降为0剩下欠款怎么办?
  8. Base64 | Base32 | Base16编码和解码
  9. 七个习惯之一:积极主动
  10. 电阻参数_电阻/电阻器的主要参数
  11. win10在哪打开ie浏览器?windows11怎么打开ie浏览器?
  12. python日期函数_Python日期时间处理: datestuff
  13. Inventory文件扩展
  14. 蓝桥杯真题 13省Cc1-猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于
  15. outlook 网页版使用公共邮箱发送邮件
  16. 哪个直播平台更适合做企业会议直播?
  17. Win32API UNICODE编码宽字节
  18. 图示电路中的等效电阻rab_例求图示电路中ab两点间的等效电阻Rab.ppt
  19. 深度学习,NLP和表征(译:小巫)
  20. python海龟绘图画玫瑰花_python学习(二)之turtle库绘图

热门文章

  1. 13.【openCV_imread()函数详解】
  2. EM算法的理解--以抛硬币为例
  3. 数据可视化(二):犯罪案件分析
  4. [C]C语言中return 0和return 1和return -1
  5. 【报告分享】 2020新青年居住消费趋势报告-贝壳研究院(附下载)
  6. 人工智能在fpga的具体应用_FPGA与人工智能浅谈
  7. Mac 必备神器之Go2Shell,最新版支持Big Sur
  8. 解决 IDEA 中 thymeleaf ${} 中报波浪线错误
  9. Jpg、png怎样变成gif?一键快速合成gif的方法?
  10. 阿里开源性能测试神器,性能监控分析工具Arthas