zoukankan      html  css  js  c++  java
  • 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 >= 0)
            return 0;
        else
            return -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/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[0])) < 0)
            return JNI_ERR;
    
        return JNI_VERSION_1_4;
    }
  • 相关阅读:
    Nginx初探
    很详细的Nginx配置说明
    linux环境下Apache+Tomcat集群配置
    Apache+Tomcat集群配置
    apache + tomcat 负载均衡分布式集群配置
    js 如何将dom转换为 图片(base64)
    饥荒猪镇物品 代码
    angular2 图片赋值的时候前面自动加 unsafe:xxx 导致图片信息不显示问题
    angular6、7 兼容ie9、10、11
    @angular/cli (angular脚手架) 如何降级
  • 原文地址:https://www.cnblogs.com/maogefff/p/7738084.html
Copyright © 2011-2022 走看看