歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Mg701 Android中背光系統架構

最主要的莫過於是了解了Android中jni編程,游蕩整個Android源碼,可以看到很多直接操作底層驅動接口,封裝成so庫,供Java調用的例子哦。

這次學習,也正是出於這樣的想法,沒想到這個設想高手們早就實現了哦,菜鳥現在也只能算是驗證了。诶,菜鳥就是菜鳥,有蟲子吃,就興奮的不得了。

驅動架構略,這裡只討論jni接口的實現。

一、我的設想

    其實設想很簡單,找到背光驅動提供給上層的API接口,人家Android還不是一樣需要一層一層的抽象(HAL、Framework),高手們考慮的東東很多,所以才一層層抽象封裝,既然這樣,咱菜鳥不就一根筋,有蟲吃就是王道啊,我為什麼不能直接將這個驅動接口封裝成jni提供給Java呢?其實這想法很早就有了,只是到現在才驗證,確實可以啊。其實Android中還是有N多這樣的例子的。

    背光驅動提供的接口是:/sys/class/leds/lcd-backlight/brightness。至於這個接口是怎麼來的??那就要去看驅動結構了。驅動注冊此接口的源碼位於:

Kernel/driver/leds/led-class.c中。

這個文件只是實現了提供上層的接口,至於真正操作硬件的驅動程序,可以給出其源碼路徑為:(硬件操作其實就是脈寬調制(PWM)),mediatek\source\kernel\drivers\leds

二、設想驗證

    這裡關鍵就是要清楚jni的接口實現規則咯,不過環境搭建也比較麻煩(ndk編譯環境)。

環境搭建另外給出日志。

Jni接口的源碼如下:

  1. #include <unistd.h>   
  2.   
  3. #include <stdio.h>   
  4.   
  5. #include <stdlib.h>   
  6.   
  7. #include <fcntl.h>   
  8.   
  9. #include <sys/types.h>   
  10.   
  11. #include <sys/stat.h>   
  12.   
  13. //#include <dirent.h>     
  14.   
  15. //#include <jni.h>   
  16.   
  17. #include <string.h>   
  18.   
  19. #include <android/log.h>   
  20.   
  21.    
  22.   
  23. #include "com_yecon_CtlBL_CtlBLActivity.h"   
  24.   
  25.    
  26.   
  27. #define  LOG_TAG    "ctlbl.c"   
  28.   
  29. #define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)   
  30.   
  31. //#define DEV_PATH "/sys/class/leds/lcd-backlight/brightness"   
  32.   
  33. //#define DEV_PATH "/sys/devices/platform/leds-mt65xx/leds/lcd-backlight/brightness"   
  34.   
  35.    
  36.   
  37. /** 
  38.  
  39.  * native method 
  40.  
  41.  */  
  42.   
  43. //JNIEXPORT jobjectArray JNICALL Java_com_yecon_CtlBL_CtlBLActivity_ctlbl(JNIEnv * env, jobject obj)   
  44.   
  45. JNIEXPORT jint JNICALL Java_com_yecon_CtlBL_CtlBLActivity_ctlbl(JNIEnv * env, jobject obj)  
  46.   
  47. {  
  48.   
  49.    
  50.   
  51.    
  52.   
  53.     int fd;  
  54.   
  55.     int err;  
  56.   
  57.     char *p;  
  58.   
  59.     char ctl[10]={"20"};  
  60.   
  61.     LOGI("HELLO!\n");  
  62.   
  63.     //__android_log_print("");   
  64.   
  65.     //printf("call ctlbl function succ!\n");   
  66.   
  67.     fd = open("/sys/class/leds/lcd-backlight/brightness",O_RDWR);  
  68.   
  69.     if(fd < 0)  
  70.   
  71.     {  
  72.   
  73.         //fprintf(stderr,"error: open %s\n",DEV_PATH);   
  74.   
  75.         LOGI("error: open!\n");  
  76.   
  77.         exit(1);  
  78.   
  79.     }  
  80.   
  81. #if 0   
  82.   
  83.     err = read(fd,ctl,1);  
  84.   
  85.     if(err != 1)  
  86.   
  87.     {  
  88.   
  89.         //fprintf(stderr,"error: write %d!\n",err);   
  90.   
  91.           
  92.   
  93.         exit(1);  
  94.   
  95.     }else{  
  96.   
  97.         //printf("the data is %s\n",ctl[0]);   
  98.   
  99.     }  
  100.   
  101. #endif   
  102.   
  103.     err=write(fd,ctl,2);  
  104.   
  105.     //printf("%s\n",ctl);   
  106.   
  107.     if(err != 2)  
  108.   
  109.     {  
  110.   
  111.         //fprintf(stderr,"error: write %d!\n",err);   
  112.   
  113.         LOGI("error: write !\n");  
  114.   
  115.         exit(1);  
  116.   
  117.     }  
  118.   
  119.       
  120.   
  121.     close(fd);  
  122.   
  123.    
  124.   
  125.     return 0;  
  126.   
  127.       
  128.   
  129.     //return (*env)->NewStringUTF(env, "Hello ww JNI !");   
  130.   
  131.       
  132.   
  133. }  

上層Java調用的源碼如下:(只是實現了一個Button,點擊,有一個消息響應,將背光調到20)

  1. package com.yecon.CtlBL;  
  2.   
  3.    
  4.   
  5. import android.app.Activity;  
  6.   
  7. import android.os.Bundle;  
  8.   
  9. import android.view.View;  
  10.   
  11. import android.view.View.OnClickListener;  
  12.   
  13. import android.widget.Button;  
  14.   
  15. import android.widget.TextView;  
  16.   
  17.    
  18.   
  19. //import com.yecon.CtlBL.ctlbljni;   
  20.   
  21.    
  22.   
  23. public class CtlBLActivity extends Activity {  
  24.   
  25.     Button b  = null;  
  26.   
  27.      
  28.   
  29. //    ctl = new ctlbljni();   
  30.   
  31.     private OnClickListener clickListener = new OnClickListener(){  
  32.   
  33.    
  34.   
  35.         @Override  
  36.   
  37.         public void onClick(View v) {  
  38.   
  39.             // TODO Auto-generated method stub   
  40.   
  41.  //           ctl.ctlbl();   
  42.   
  43.               ctlbl();  
  44.   
  45.         }  
  46.   
  47.     };  
  48.   
  49.             
  50.   
  51.     /** Called when the activity is first created. */  
  52.   
  53.     @Override  
  54.   
  55.     public void onCreate(Bundle savedInstanceState) {  
  56.   
  57.         super.onCreate(savedInstanceState);  
  58.   
  59.         setContentView(R.layout.main);  
  60.   
  61.         b = (Button) this.findViewById(R.id.BtnCancel);  
  62.   
  63.         b.setOnClickListener(clickListener);  
  64.   
  65. //        TextView  tv = new TextView(this);   
  66.   
  67.  //       tv.setText( ctlbl() );   
  68.   
  69.  //       setContentView(tv);   
  70.   
  71.     }  
  72.   
  73.       
  74.   
  75.     public native int ctlbl();//本地方法   
  76.   
  77.       
  78.   
  79.     static {  
  80.   
  81.         System.loadLibrary("ctlbl");//載入so庫   
  82.   
  83.     }  
  84.   
  85. }  

看上去,沒幾行代碼,so easy!!看看高手們的實現吧!! 

Copyright © Linux教程網 All Rights Reserved