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:
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で生成された関数名に関数入口を交換する.
7.jniディレクトリの下にAndoridを新規作成します.mk[実際にはled.cのためにmakefileを作成する]
Android.mk:
ndk-buildコンパイルによるsoライブラリの生成
8.eclipseに戻り、生成したsoライブラリをledに追加する.JAvaで
led.java:
9.レイアウトを変更し、led.xmlでインタフェースにボタンを追加
res --> layout --> led.xml:
10.led.JAvaにリスニングキーコード(最終led.java)を追加
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)は失敗する.
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)は失敗する.