OK 6410 Androidアプリケーション:(jni方式)制御LED/GPIO

7394 ワード

前述の記事では、ledドライバモジュールの作成方法について説明します.ここでは、Androidアプリケーションを作成してLED/GPIOを制御する方法について説明します.弟は才能がなくて、JAVAを使うことができなくて、だからこのアプリケーションはCで书いたので、それからjavaでいくつかのボタンを実现して、コードと外観はすべて比较的に丑くて、みんな喷かないでください!余計なことを言わないで、コードを貼ってください.
1.eclipseプロジェクトの新規作成
 
2.led.JAvaにpublic static native int led(int i,int j)を加える.
  led.java:
package com.example.led;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class LED extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.led);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.led, menu);
        return true;
    }
    
    public static native int led(int i, int j);  
}

3.プロジェクトファイルをコンパイルすると、binディレクトリの下にledが生成されます.apk.
4.端末がプロジェクトディレクトリに入り、jniディレクトリを新規作成する
5.javahコマンドを使用して、jni形式に適合する関数名を含むヘッダファイルを生成します.
    javah -classpath bin/classes -d jni com.example.led.LED
6.jniディレクトリの下に新しいled.c
このcプログラムは、実際にはlinuxのLEDテストプログラムである、java呼び出しのために上記javahで生成された関数名に関数入口を交換する.
#include 
#include    
#include    
#include 
#include    
#include    
#include 

#define LOG_TAG "LED"       //android logcat
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__    )
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS_    _)

//int main(int argc, char **argv)  
jint JNICALL Java_com_example_led_Led_led(JNIEnv *env, jclass thiz, jint led_nu, jint on) 
{  
    int fd;  
    
    fd = open("/dev/leds0", O_RDWR);
    if(fd < 0)  
    printf("Can't open /dev/leds!
"); ioctl(fd, on, led_nu); LOGI("led_nu=%d,state=%d
", led_nu, on); close(fd); return 0; }

7.jniディレクトリの下にAndoridを新規作成します.mk[実際にはled.cのためにmakefileを作成する]
    Android.mk:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := LED 
LOCAL_SRC_FILES := led.c
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics \
include $(BUILD_SHARED_LIBRARY)
  

ndk-buildコンパイルによるsoライブラリの生成
 
8.eclipseに戻り、生成したsoライブラリをledに追加する.JAvaで
   led.java:
package com.example.led;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class LED extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.led);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.led, menu);
        return true;
    }
    
    public static native int led(int i, int j);
    
    static 
    {
    	System.loadLibrary("LED");
    }
}

9.レイアウトを変更し、led.xmlでインタフェースにボタンを追加
  res --> layout --> led.xml:
  


    
    
    
    


10.led.JAvaにリスニングキーコード(最終led.java)を追加
package com.example.led;

import android.app.Activity;  
import android.content.Intent;  
import android.net.Uri;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.Button; 
import android.widget.ToggleButton;
import android.util.Log;
import android.widget.CompoundButton.OnCheckedChangeListener;


public class Led extends Activity {
	private static final String TAG = "LED";
	private ToggleButton button1;
	private ToggleButton button2;
	private ToggleButton button3;
	private ToggleButton button4;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.led);  
        Log.w(TAG,"layout");

        button1 = (ToggleButton)findViewById(R.id.btn1);  
        button2 = (ToggleButton)findViewById(R.id.btn2);  
        button3 = (ToggleButton)findViewById(R.id.btn3);
        button4 = (ToggleButton)findViewById(R.id.btn4); 
        Log.w(TAG,"button");      
       button1.setOnClickListener(new Button.OnClickListener()
        {
        	public void onClick(View v)
        	{
        		if (button1.isChecked()) 
        		{
        			Log.w(TAG,"----led1 on"); 
        			led(0, 1);
        		}
        		else
        		{
        			Log.w(TAG,"----led1 off");
        			led(0, 0);
        		}
        	}
        }); 
       
        button2.setOnClickListener(new Button.OnClickListener()
        {
        	public void onClick(View v)
        	{
        		if (button2.isChecked()) 
        		{
        			Log.w(TAG,"----led2 on"); 
        			led(1, 1);
        		}
        		else
        		{
        			Log.w(TAG,"----led2 off");
        			led(1, 0);
        		}
        	}
        });   
  
        button3.setOnClickListener(new Button.OnClickListener()
        {
        	public void onClick(View v)
        	{
        		if (button3.isChecked()) 
        		{
        			Log.w(TAG,"----led3 on"); 
        			led(2, 1);
        		}
        		else
        		{
        			Log.w(TAG,"----led3 off");
        			led(2, 0);
        		}
        	}
        });   

        button4.setOnClickListener(new Button.OnClickListener()
        {
        	public void onClick(View v)
        	{
        		if (button4.isChecked()) 
        		{
        			Log.w(TAG,"----led4 on"); 
        			led(3, 1);
        		}
        		else
        		{
        			Log.w(TAG,"-----led4 off");
        			led(3, 0);
        		}
        	}
        });   
          
    }  
   
    public static native int led(int i, int j);
    
    static 
    {
    	System.loadLibrary("LED");
    }

}

11.プロジェクト全体をコンパイルしbinディレクトリの下でledを生成する.apkは、開発ボードにコピーすることでインストール運転が可能になる.
注意:ledをインストールします.apkの前にledをロードしてください.koモジュールは、コンパイルモジュールに使用するカーネルバージョンとandroidバージョンを確認する.また、/dev/leds 0をシリアルポートで変更する権限は777とする必要がある.(chmod 777/dev/leds 0)、そうでない場合led.cのopen("/dev/leds 0",o_RDWR)は失敗する.