android驅動學習入門-android應用怎麼呼叫驅動2
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
<div class="htmledit_views">
android應用怎麼呼叫驅動的結構層次:
android應用
|
| 通過native實現
|
C/C++程式碼
|
| 通過open(close、ioctl、write、read)操作裝置
|
C裝置驅動
從上面可以看得出,上層android應用要呼叫底層驅動,簡單的方式就是,先通過native呼叫C/C++,再通過open(close、ioctl、write、read)動作,操作驅動,就是那麼一個過程。
上一篇文章已經說過:C/C++怎麼呼叫驅動程式http://blog.csdn.net/menghnhhuan/article/details/7428693
下面說一下android應用是怎麼通過native呼叫C/C++程式碼的,可以將native方法比作Java程式同C程式的介面,其實現步驟:
1、在Java中宣告native()方法,然後編譯;
2、用javah產生一個.h檔案;
3、寫一個.c檔案實現native匯出方法,其中需要包含第二步產生的.h檔案(注意其中又包含了JDK帶的jni.h檔案);
4、將第三步的.c檔案編譯成動態連結庫檔案.SO;
5、在Java中用System.loadLibrary()方法載入第四步產生的動態連結庫檔案,這個native()方法就可以在Java中被訪問了。
首先建立一個android專案,寫一個程式碼控制這個led的亮滅,程式碼如下:
public class NativeExampleActivity extends Activity { TextView textView01; private Button btnStart; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStart = (Button) this.findViewById(R.id.btnStart); btnStart.setOnClickListener(clickButtonStart); textView01 = (Button) this.findViewById(R.id.btnStart); } private OnClickListener clickButtonStart = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //textView01.setText("led state: "+ledFunction(0)); textView01.setText("led state: "+ledFunction(1)); } }; static { try { System.loadLibrary("org_natives_example_NativeExampleActivity");//載入庫檔案,系統會自動處理成lib***.so } catch (Throwable t) { } } public native int ledFunction(int a);//native方法,控制led的亮滅 }
然後在工程的bin/classes目錄下在cmd中執行javah -jni org.natives.example.NativeExampleActivity,
就會在根目錄下得到一個org_natives_example_NativeExampleActivity.h的檔案
然後根據標頭檔案的內容編寫org_natives_example_NativeExampleActivity.c檔案
#include "com_hode_hodeframework_modelupdate_CheckFile.h" JNIEXPORT jint JNICALL Java_org_natives_example_NativeExampleActivity_ledFunction(JNIEnv *, jobject, jint a) { int fd; int ret; fd = open("/dev/vib",O_RDWR);//Open device ,get the handle if(a==0) ioctl(fd,0x22); //call the output function to on LEDs else ioctl(fd,0x11); //call the output function to off LEDs ret = close(fd); //close device return a; }
之後編譯生成so檔案如“liborg_natives_example_NativeExampleActivity.so”,名稱與System.loadLibrary(”org_natives_example_NativeExampleActivity”)中的名稱一致
Android.mk檔案如下:
LOCAL_PATH := $(call my-dir)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_MODULE := liborg_natives_example_NativeExampleActivity LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := org_natives_example_NativeExampleActivity.c LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">LOCAL_SHARED_LIBRARIES := libutils</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">include $(BUILD_SHARED_LIBRARY)
把編譯生成的庫.so和之前的驅動.ko檔案push到手機,下載應用,led就可以跑起來了。
相關文章
- Android音訊驅動學習(一) Audio HALAndroid音訊
- 驅動開發入門
- 學Linux驅動: 應該先了解驅動模型Linux模型
- Android 觸控式螢幕驅動Android
- Android硬體服務框架例項之Vibrator(驅動到應用)Android框架
- extcon驅動及其在USB驅動中的應用
- 驅動精靈是幹嘛的 驅動精靈怎麼安裝驅動
- 載入驅動
- linux裝置驅動編寫入門Linux
- 360驅動大師怎麼安裝印表機驅動 360驅動安裝印表機的步驟
- win10怎麼關閉自動安裝驅動_怎麼禁止win10自動安裝驅動Win10
- mtd裝置驅動(待學習)
- Android 應用啟動流程Android
- 領域驅動設計(DDD)入門&概要
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 怎麼更新電腦藍芽驅動 win10藍芽驅動更新藍芽Win10
- 惠普印表機驅動怎麼安裝 惠普印表機驅動安裝教程
- win10系統優化驅動器怎麼用_win10如何優化驅動器Win10優化
- linux驅動之LED驅動Linux
- win10系統怎麼更新驅動 win10更新驅動的方法Win10
- dvd驅動器怎麼刪除 win10如何刪除dvd驅動器Win10
- Log新增MongoDB驅動2MongoDB
- Android應用啟動流程分析Android
- Windows驅動開發入門 -- 理清基本概念Windows
- win10 關閉驅動更新頂方法 win10怎麼禁用自動更新驅動Win10
- RK3399的Android系統驅動UVC攝像頭Android
- Google:全球使用Android驅動的裝置達30億臺GoAndroid
- 新字元驅動框架驅動LED字元框架
- win10 inf驅動怎麼安裝_win10 inf驅動如何安裝Win10
- Android 補間動畫學習Android動畫
- 字元裝置驅動——申請、建立、應用.字元
- win10系統最佳化驅動器怎麼用_win10如何最佳化驅動器Win10
- Android日常學習:Android檢視動畫-View AnimationAndroid動畫View
- win10如何關閉系統驅動更新 怎麼禁止win10自動更新驅動Win10
- 【Android開發入門教程】二.Android應用程式結構分析Android
- win10驅動更新關閉如何開啟 win10禁用自動更新驅動怎麼啟動Win10
- Windows10系統怎麼啟用bitlocker驅動器加密Windows加密
- android基礎學習-android篇day12-android的UI基礎入門AndroidUI