Android底层调用的入门---JNI实践
来源:互联网 发布:linux man命令怎么用 编辑:程序博客网 时间:2024/05/01 21:59
一、前言
众所周知,android系统不能直接控制底层硬件,像单片机那样简单的点个LED灯对于安卓系统来说可没那么简单,那么它是用什么方式来操作底层接口呢?本文对此一一进行探讨。
二、JNI是Android操作底层的利器
JNI是Java Native Interface的缩写,中文为Java本地调用。
Native方法一般用于两种情况:
1)在方法中调用一些不是由java语言写的代码。对于android来说就是C/C++。
2)在方法中用java语言直接操纵计算机硬件。对于android系统底层而已就是linux底层,通过linux C读写操作设备文件dev或者sys文件。
一般android操作硬件的流程是:app ==> JNI ==> linux硬件驱动 ==> 硬件。
三、android系统下的JNI格式。
下面以一个buzzer蜂鸣器的控制为例子演示一下android到底是如何使用jni的。
这个jni总共有三个源文件:com_topeet_buzzertest_buzzer.c ,com_topeet_buzzertest_buzzer.h, Android.mk。其中Android.mk其实就是android下面的Makefile。
1.Android.mk文件的内容如下:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := buzzerLOCAL_SRC_FILES := com_topeet_buzzertest_buzzer.cLOCAL_LDLIBS += -llog LOCAL_LDLIBS +=-lminclude $(BUILD_SHARED_LIBRARY)
2.com_topeet_buzzertest_buzzer.c 的文件内容如下:
#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <stdint.h>#include <termios.h>#include <android/log.h>#include <sys/ioctl.h>#include "com_topeet_buzzertest_buzzer.h"#undef TCSAFLUSH#define TCSAFLUSH TCSETSF#ifndef _TERMIOS_H_#define _TERMIOS_H_#endifint fd=0;/* * Class: com_topeet_buzzertest_buzzer * Method: Open * Signature: ()I */JNIEXPORT jint JNICALL Java_com_topeet_buzzertest_buzzer_Open (JNIEnv *env, jobject obj) { if(fd<=0)fd = open("/dev/buzzer_ctl", O_RDWR|O_NDELAY|O_NOCTTY); if(fd <=0 )__android_log_print(ANDROID_LOG_INFO, "serial", "open /dev/buzzer_ctl Error"); else __android_log_print(ANDROID_LOG_INFO, "serial", "open /dev/buzzer_ctl Sucess fd=%d",fd); }/* * Class: com_topeet_buzzertest_buzzer * Method: Close * Signature: ()I */JNIEXPORT jint JNICALL Java_com_topeet_buzzertest_buzzer_Close (JNIEnv *env, jobject obj) { if(fd > 0)close(fd); }/* * Class: com_topeet_buzzertest_buzzer * Method: Ioctl * Signature: ()I */JNIEXPORT jint JNICALL Java_com_topeet_buzzertest_buzzer_Ioctl (JNIEnv *env, jobject obj, jint num, jint en) { ioctl(fd, en, num); }
3.com_topeet_buzzertest_buzzer.h的文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_neojet_scanner_key */#ifndef _Included_com_topeet_buzzertest_buzzer#define _Included_com_topeet_buzzertest_buzzer#ifdef __cplusplusextern "C" {#endif/* * Class: com_topeet_buzzertest_buzzer * Method: Open * Signature: ()I */JNIEXPORT jint JNICALL Java_com_topeet_buzzertest_buzzer_Open (JNIEnv *, jobject);/* * Class: com_topeet_buzzertest_buzzer * Method: Close * Signature: ()I */JNIEXPORT jint JNICALL Java_com_topeet_buzzertest_buzzer_Close (JNIEnv *, jobject);/* * Class: com_topeet_buzzertest_buzzer * Method: Ioctl * Signature: ()I */JNIEXPORT jint JNICALL Java_com_topeet_buzzertest_buzzer_Ioctl (JNIEnv *, jobject, jint num, jint en);#ifdef __cplusplus}#endif#endif
0 0
- Android底层调用的入门---JNI实践
- 【Android】Android中使用JNI调用底层C++代码
- Android底层开发(二)之编写调用JNI层的java库 第四步
- Android底层调用C代码(JNI实现)
- Android Studio + JNI 实践~入门第一步
- android JNI的调用
- JNI与底层调用-1
- JNI与底层调用-2
- android 的JNI调用整理
- Android的jni调用方式
- Android 调用Jni的全过程
- Android jni的调用过程
- Android JNI的调用过程
- Android------JNI的调用方法
- Android------JNI的调用方法
- Java调用C++: JNI的使用入门
- Android /system/lib底层库的调用
- [android ndk]android studio动态库生成及jni底层调用步骤
- 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】
- 蓝桥 ADV-233 算法提高 队列操作 【STL】
- 104.归属地风格的自定义选择
- 2017/4/6
- 聚类分析学习笔记(三)
- Android底层调用的入门---JNI实践
- 真实GPS坐标信息转百度地图坐标
- 利用递归实现全排列
- Android 学习资料收集
- 【计算机视觉】关于用opencv 设置摄像头读分辨率问题的若干说明
- Java序列化和反序列化
- caffe上手:如何导出caffemodel参数
- 迷你图书器
- a标签连接空标签的方法