Android 直接通过JNI访问驱动
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访问驱动的更多相关文章
- Android集成C程序访问驱动设备节点
1.前言 Android系统中,应用程序一般是使用Java语言进行开发的,但是通过C语言也可以进行Android中的可执行程序开发,接下来,将简单介绍在Android系统中如何通过C程序来访问内核中s ...
- [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888
[Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888 标签: androidbitmapjni 2014-05-09 20:35 2985人阅读 评论(1) 收 ...
- Android 通过 JNI 访问 Java 字段和方法调用
在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型.字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系. 有了之前那些基础,就可以实现 Jav ...
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
- 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...
- Android 开发 之 JNI入门 - NDK从入门到精通
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...
- Android深入理解JNI(二)类型转换、方法签名和JNIEnv
相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换.方法签名和JNIEnv. 1.数据类型的转换 首先给出上一篇文章 ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- 深入理解Android(2)——理解Android中的JNI(中)
阳光小强参加了CSDN博客之星评选,如果你觉得阳光小强的博客对你有所帮助,为小强投上一票吧:http://vote.blog.csdn.net/blogstar2014/details?usernam ...
随机推荐
- 自己从0开始学习Unity的笔记 IV (C#循环练习输出素数)
来测试一下循环....刚刚学了while循环,测试一下输出1-100的素数 我想了一下,素数就是只能被1和本身整除,那就是只能被整除2次,我是顺着这个思路写的代码,如果被整除超过2次,那么肯定不是素数 ...
- Katalon Studio简单使用(二)
距离上一篇更新katalon学习部分已有两个月的时间 ,我的博文的访问量为400多,(*^__^*) 嘻嘻…… 说明还是很多同学在学习这个小tools的.所以再记录下 近两个月来对katalon的体验 ...
- cesium编程入门(九)实体 Entity
cesium编程入门(九)实体 Entity 在cesium编程入门(五)绘制形状提到过添加实体的方法,这一节聊一聊实体相关的一些内容: 先来看 Entity 的各个属性 id 唯一标志,如果没设置, ...
- SQL去除重复记录
SQL去除重复记录 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[Name ...
- hud 5124 lines(思维 + 离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 lines Problem Description: John has several lines. ...
- JPA之@GeneratedValue注解
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...
- docker为什么适合devops?
欢迎访问网易云社区,了解更多网易技术产品运营经验 进阶版结论:Kubernetes + Docker 是 Dev 和 Ops 融合的一个桥梁. DevOps 强调的是高效组织团队之间如何通过自动化 ...
- Python----初次见面,请多关照!
1.计算机的最基本认识 CPU(大脑) 3GHZ + 内存(DDR4) + 主板 + 电源(心脏)+ 显示器 + 键盘 +鼠标+ 显卡 + 硬盘 80MB/s 操作系统分为: windows 家用 l ...
- vue 中的computed和watch
计算属性 通过计算得来的属性 computed:是一个计算属性,用来监听属性的变化 computed里面的方法调用的时候是不需要加() 另外里面的方法必须要有一个返回值 computed里面的方法 ...
- java使用Redis1--安装与简单使用
环境: CentOS6.4,Redis3.0.3 一.Redis安装(需要安装gcc) 官网http://download.redis.io/releases/redis-3.0.3.tar.gz上下 ...