package com.yang.jniaccesshardware;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
import com.yang.hardlibrary.HardControl;
public class MainActivity extends AppCompatActivity { private boolean led_on = false;
private Button button;
private CheckBox led1;
private CheckBox led2;
private CheckBox led3;
private CheckBox led4; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.BUTTON);
HardControl.ledOpen();
led1=(CheckBox)findViewById(R.id.led1);
led2=(CheckBox)findViewById(R.id.led2);
led3=(CheckBox)findViewById(R.id.led3);
led4=(CheckBox)findViewById(R.id.led4); button.setOnClickListener(new MyButtonListener());
}
class MyButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) { HardControl hardControl = new HardControl();//依赖硬件 led_on = !led_on;
if (led_on) {
button.setText("ALL OFF");
led1.setChecked(true);
led2.setChecked(true);
led3.setChecked(true);
led4.setChecked(true);
for (int i = 0; i < 4; i++)
HardControl.ledCtrl(i, 1);
}
else {
button.setText("ALL ON");
led1.setChecked(false);
led2.setChecked(false);
led3.setChecked(false);
led4.setChecked(false);
for (int i = 0; i < 4; i++)
HardControl.ledCtrl(i, 0);
}
}
}
public void onCheckboxClicked(View view) {
// Is the view now checked?
boolean checked = ((CheckBox) view).isChecked(); // Check which checkbox was clicked
switch(view.getId()) {
case R.id.led1:
if (checked)
{
Toast.makeText(getApplicationContext(),"led1_on",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(1, 1);
}
else
{
Toast.makeText(getApplicationContext(),"led1_off",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(1, 0);
}
break;
case R.id.led2:
if (checked)
{
Toast.makeText(getApplicationContext(),"led1_on",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(2, 1);
}
else
{
Toast.makeText(getApplicationContext(),"led1_off",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(2, 0);
}
break;
case R.id.led3: if (checked)
{
Toast.makeText(getApplicationContext(),"led1_on",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(3, 1);
}
else
{
Toast.makeText(getApplicationContext(),"led1_off",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(3, 0);
}
break;
case R.id.led4:
if (checked)
{
Toast.makeText(getApplicationContext(),"led1_on",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(4, 1);
}
else
{
Toast.makeText(getApplicationContext(),"led1_off",Toast.LENGTH_LONG).show();
HardControl.ledCtrl(4, 0);
}
break;
}
}
}
package com.yang.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();
}
} }
#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;
#endif static 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 >= )
return ;
else
return -;
} 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/yang/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[])) < )
return JNI_ERR; return JNI_VERSION_1_4;
}

Android 直接通过JNI访问驱动的更多相关文章

  1. Android集成C程序访问驱动设备节点

    1.前言 Android系统中,应用程序一般是使用Java语言进行开发的,但是通过C语言也可以进行Android中的可执行程序开发,接下来,将简单介绍在Android系统中如何通过C程序来访问内核中s ...

  2. [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888

    [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888 标签: androidbitmapjni 2014-05-09 20:35 2985人阅读 评论(1) 收 ...

  3. Android 通过 JNI 访问 Java 字段和方法调用

    在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型.字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系. 有了之前那些基础,就可以实现 Jav ...

  4. 【转】 Android 开发 之 JNI入门 - NDK从入门到精通

    原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub  ...

  5. 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  6. Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  7. Android深入理解JNI(二)类型转换、方法签名和JNIEnv

    相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换.方法签名和JNIEnv. 1.数据类型的转换 首先给出上一篇文章 ...

  8. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  9. 深入理解Android(2)——理解Android中的JNI(中)

    阳光小强参加了CSDN博客之星评选,如果你觉得阳光小强的博客对你有所帮助,为小强投上一票吧:http://vote.blog.csdn.net/blogstar2014/details?usernam ...

随机推荐

  1. C# 依赖注入 & MEF

    之前面试有问道依赖注入,因为一直是做客户端的发开发,没有接触这个,后边工作接触到了MEF,顺便熟悉一下依赖注入 详细的概念解释就不讲了,网上一大把,个人觉着依赖注入本质是为了解耦,方便扩展 依赖注入的 ...

  2. Java 使用json 做配置文件

    概述 经常会用到通过配置文件,去配置一些参数,java里面本来是有配置文件的,但是导入很麻烦的,自从我用了json之后,从此一切配置文件都见鬼去吧. 1.下载gson解析json文件的jar包     ...

  3. c# in out ref关键字

    class in_out_ref { #region in 关键字 delegate void DContravariant<in A>(A argumen); static void o ...

  4. MvvmLight框架使用入门(四)

    本篇我们着重介绍ViewModelBase,演示Set和RaisePropertyChanged方法的使用,以及就Cleanup方法释放资源展开讨论. ICleanup 接口.实现该接口的ViewMo ...

  5. yield 学习

    什么是生成器 生成器是可以迭代的,但是你只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据. yield 理解 通常的for...in...循环中,in后面是一个数组,这个数组就是 ...

  6. JAVA常见面试题之Forward和Redirect的区别 (转发和重定向)

    阅读目录 一:间接请求转发(Redirect) 二:直接请求转发(Forward) 用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相 ...

  7. phpStorm配置SVN与FTP数据传输

    公司php开发时候,需要搭建环境,自己捋了下思路,公司代码放在SVN服务器上,需要在本机安装TortoiseSVN软件,将代码下载到本机,在本机上调试程序,修改代码,修改的代码再上传到SVN.之后通过 ...

  8. day04 --class --homework

    # -*- coding: utf-8 -*- # @Time : 2018/12/24 12:10 # @Author : Endless-cloud # @Site : # @File : 04 ...

  9. mybatis的执行流程

    1.SqlSessionFactoryBuilder与SqlSessionFactory 我们一般在使用mybatis是都会通过new SqlSessionFactoryBuilder.build(. ...

  10. Java NIO学习与记录(一):初识NIO

    初识 工作中有些地方用到了netty,netty是一个NIO框架,对于NIO却不是那么熟悉,这个系列的文章是我在学习NIO时的一个记录,也期待自己可以更好的掌握NIO. 一.NIO是什么? 非阻塞式I ...