• ok6410 android driver(9)


      In this essay, I will write the JNI to test our leds device.

      If you don't know how to create a jni project, I suggest you to have a read on the following website : 

    http://www.cnblogs.com/plinx/p/3213824.html

      1、string.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <string name="app_name">ledsjni</string>
        <string name="action_settings">Settings</string>
        <string name="string_hello">String input:</string>
        <string name="str_button">Str Input</string>
        <string name="ioctl_hello">I/O control:</string>
        <string name="io_button">I/O Input</string>
        <string name="led1">Led1</string>
        <string name="led2">Led2</string>
        <string name="led3">Led3</string>
        <string name="led4">Led4</string>
    
    </resources>

      2、activity_main.xml

      (1) graphical layout

      TIPS :

    Ok6410's screen is placing horizontally, so you should design your application horizontally to adapt the screen.

      (2) activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <CheckBox
            android:id="@+id/checkBox_str1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/textView_str"
            android:text="@string/led1" />
    
        <TextView
            android:id="@+id/textView_str"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="@string/string_hello" />
    
        <TextView
            android:id="@+id/textView_io"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/checkBox_str1"
            android:layout_below="@+id/checkBox_str1"
            android:text="@string/ioctl_hello" />
    
        <Button
            android:id="@+id/onClick_strButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/textView_io"
            android:layout_alignParentRight="true"
            android:onClick="onClick_strButton"
            android:text="@string/str_button" />
    
        <Button
            android:id="@+id/onClick_ioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@+id/onClick_strButton"
            android:layout_below="@+id/textView_io"
            android:onClick="onClick_ioButton"
            android:text="@string/io_button" />
    
        <CheckBox
            android:id="@+id/checkBox_io1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/textView_io"
            android:text="@string/led1" />
    
        <CheckBox
            android:id="@+id/checkBox_io2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView_io"
            android:layout_toRightOf="@+id/checkBox_io1"
            android:text="@string/led2" />
    
        <CheckBox
            android:id="@+id/checkBox_io3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView_io"
            android:layout_toRightOf="@+id/checkBox_str2"
            android:text="@string/led3" />
    
        <CheckBox
            android:id="@+id/checkBox_io4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView_io"
            android:layout_toRightOf="@+id/checkBox_io3"
            android:text="@string/led4" />
    
        <CheckBox
            android:id="@+id/checkBox_str2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView_str"
            android:layout_toRightOf="@+id/checkBox_str1"
            android:text="@string/led2" />
    
        <CheckBox
            android:id="@+id/checkBox_str3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView_str"
            android:layout_toRightOf="@+id/checkBox_str2"
            android:text="@string/led3" />
    
        <CheckBox
            android:id="@+id/checkBox_str4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView_str"
            android:layout_toRightOf="@+id/checkBox_str3"
            android:text="@string/led4" />
    
    </RelativeLayout>

      3、MainActivity.java

    package com.example.ledsjni;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.CheckBox;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
        private CheckBox[] cbox_str = new CheckBox[4];
        private CheckBox[] cbox_io  = new CheckBox[4];
        private TextView tview_str;
        private TextView tview_io;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tview_str = (TextView)findViewById(R.id.textView_str);
            tview_io = (TextView)findViewById(R.id.textView_io);
            
            cbox_str[0] = (CheckBox)findViewById(R.id.checkBox_str1);
            cbox_str[1] = (CheckBox)findViewById(R.id.checkBox_str2);
            cbox_str[2] = (CheckBox)findViewById(R.id.checkBox_str3);
            cbox_str[3] = (CheckBox)findViewById(R.id.checkBox_str4);
            
            cbox_io[0] = (CheckBox)findViewById(R.id.checkBox_io1);
            cbox_io[1] = (CheckBox)findViewById(R.id.checkBox_io2);
            cbox_io[2] = (CheckBox)findViewById(R.id.checkBox_io3);
            cbox_io[3] = (CheckBox)findViewById(R.id.checkBox_io4);
        }
        
        public void onClick_strButton(View view) {
            tview_io.setText("I/O control:");
            String str = "";
            for (int i = 0; i < 4; i++) {
                if(cbox_str[i].isChecked())
                    str += "1";
                else
                    str += "0";
            }
            tview_str.setText("Leds :" + str);
            strLeds(str);
        }
        
        public void onClick_ioButton(View view) {
            tview_str.setText("I/O control:");
            String str = "";
            for (int i = 0; i < 4; i++) {
                if(cbox_io[i].isChecked()) {
                    ioLeds(1, i);
                    str += "1";
                } else {  
                    ioLeds(0, i);
                    str += "0";
                }
            }
            tview_io.setText("Leds :" + str);
        }
        
        public native void strLeds(String str);
        public native void ioLeds(int cmd, int arg);
        
        static {
            System.loadLibrary("ledsjni");
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }

      4、ledsjni.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_example_ledsjni_MainActivity */
    
    #ifndef _Included_com_example_ledsjni_MainActivity
    #define _Included_com_example_ledsjni_MainActivity
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_example_ledsjni_MainActivity
     * Method:    strLeds
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_com_example_ledsjni_MainActivity_strLeds
      (JNIEnv *, jobject, jstring);
    
    /*
     * Class:     com_example_ledsjni_MainActivity
     * Method:    ioLeds
     * Signature: (II)V
     */
    JNIEXPORT void JNICALL Java_com_example_ledsjni_MainActivity_ioLeds
      (JNIEnv *, jobject, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

      5、ledsjni.cpp

    #include <jni.h>
    #include <string.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    #include "ledsjni.h"
    
    char* jstring_to_pchar(JNIEnv* env, jstring str)
    {
        char* pstr = NULL;
        jclass clsstring = env->FindClass("java/lang/String");
        jstring strencode = env->NewStringUTF("utf-8");
        jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
        jbyteArray byteArray = (jbyteArray)(env->CallObjectMethod(str, mid, strencode));
        jsize size = env->GetArrayLength(byteArray);
        jbyte* pbyte = env->GetByteArrayElements(byteArray, JNI_FALSE);
        if (size > 0) {
            pstr = (char*) malloc(size);
            memcpy(pstr, pbyte, size);
        }
        return pstr;
    }
    
    
    JNIEXPORT void JNICALL Java_com_example_ledsjni_MainActivity_strLeds
      (JNIEnv* env, jobject thiz, jstring str)
    {
        int fd_leds;
        fd_leds = open("/dev/s3c6410_leds", O_WRONLY);
        char* pstr = jstring_to_pchar(env, str);
        if (pstr != NULL) {
            write(fd_leds, pstr, strlen(pstr));
        }
    
        close(fd_leds);
    }
    
    JNIEXPORT void JNICALL Java_com_example_ledsjni_MainActivity_ioLeds
      (JNIEnv* env, jobject thiz, jint cmd, jint arg)
    {
        int fd_leds;
        fd_leds = open("/dev/s3c6410_leds", O_WRONLY);
        ioctl(fd_leds, cmd, arg);
    
        close(fd_leds);
    }

      That's all about the ledsjni and leds device driver.

      

      

  • 相关阅读:
    小总结:fibonacci数的产生
    pick the stone game
    温故知新的错题训练:Coin game
    《博弈论的诡计》
    思维+博弈论:字符串操作
    一下午的编程思索录
    2018中国大学生程序设计竞赛
    温故知新的经典贪心题目:今年暑假不AC?
    2019-2020新学的一些东西(持续更新)
    【半平面交】JZOJ3297. 【SDOI2013】逃考
  • 原文地址:https://www.cnblogs.com/plinx/p/3221505.html
Copyright © 2020-2023  润新知