s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)
歡迎轉載,務必注明出處:http://blog.csdn.net/wang_shuai_ww/article/details/44416041
eclipse完整工程下載地址:http://download.csdn.net/detail/u010406724/8515359
本篇是在本系列前三篇的基礎上做的。記錄盡量做的完善,讀者在閱讀本篇時,請確保前面的驅動和抽象層都已經編譯沒問題,且在開發板上能夠正確跑起來,免得在參閱本篇文章寫自己的程序時出現莫名的錯誤。
本篇將會介紹兩種APP的編譯方法,不過編寫代碼還是需要在eclipse中進行的。
在前面第二篇文章中我們知道,我們為app上層應用創建了一個java類接口服務ILedService,所以我們在編寫配套的應用程序時需要這個類才行。我們知道eclipse使用的官方sdk是不含有我們自己創建的ILedService服務的,這個服務只存在于我們編譯的Android源碼中。為此我們需要我們建立的eclipse工程能夠引用我們創建的ILedService類。
我網上搜索以及按照自己的理解嘗試了不少的方法,最后找到了這篇文章http://blog.csdn.net/beihai1212/article/details/8782700,介紹的還是很不錯的,經過嘗試,我選擇了這篇文章的第二種方法,看著比較官方,O(∩_∩)O。其實管理起來也方便,下次再使用時直接添加就可以了。
下面介紹怎么使用我們創建的ILedService類。
1.首先找到編譯好的源碼目錄下的out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar這個文件,把它拷貝到eclipse所在的系統平臺,我eclipse使用的是Windows平臺。為了好管理,我就在官方sdk的platforms目錄下建立一個文件夾android-realarm來存放classes.jar這個文件,如下圖所示:
一般來說我們只需要classes.jar所包含的類就足夠使用了,其他的就不需要了。
下面就介紹怎么來寫app應用和編譯了
一.eclipse 編寫和編譯app
1.首先創建一個簡單的工程,我命名為LedTest,具體的步驟就不再寫了,注意在選擇Target SDK和Compile With時要選擇API19,即Android4.4的版本,創建好的工程如下圖所示:
設置圖示:
工程圖示:
2.添加我們自己的classes.jar類庫
(1)右鍵工程名,選擇下圖所示的紅圈:
(2)在Libraries欄,選擇Add Library
(3)然后是User Library,點擊next,選擇User Libraries,點擊new,填寫一個庫的名字,我的是android-realarm,下面的System library要勾上,確定,之后如下圖所示:
(3)點擊Add External JAR,彈出對話框,選擇我們前面存儲的xxx\sdk\platforms\android-realarm\classes.jar文件,如下圖所示:
(4)OK確認,然后Finish,完成設置,這時這個classes類庫添加進我們的工程了,如下圖:
(5)選擇下圖的紅色部分,并點擊進入:
(6)右邊有up選項,把android-realarm移動到Android 4.4.2前面即可。
(7)OK確定,回到工程,確認庫的添加,如下圖:
如果結果如上圖所示,那么就說明我們需要的類庫添加成功了,那么下面我們就可以寫程序了。
(8)MainActivity.java代碼如下:
package com.example.ledtest;import android.app.Activity; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.ToggleButton; import android.os.ILedService; public class MainActivity extends Activity {private final static String LOG_TAG = "sean.realarm.led.activity";private ILedService ledservice = null;private ToggleButton btnLed;private ImageView imageLed;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnLed = (ToggleButton) findViewById(R.id.btnLed);imageLed = (ImageView) findViewById(R.id.imageLed);ledservice = ILedService.Stub.asInterface(ServiceManager.getService("led"));try {Log.i(LOG_TAG, "Exception while reading value from led service0.");imageLed.setImageResource(R.drawable.bulboff);ledservice.setOff(0);} catch (RemoteException e) {Log.e(LOG_TAG, "Remote Exception while reading value from led service0.");}btnLed.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {if(btnLed.isChecked()){try {Log.i(LOG_TAG, "Exception while reading value from led service1.");imageLed.setImageResource(R.drawable.bulbon);ledservice.setOn(0);} catch (RemoteException e) {Log.e(LOG_TAG, "Remote Exception while reading value from led service1.");}}else{try {Log.i(LOG_TAG, "Exception while reading value from led service2.");imageLed.setImageResource(R.drawable.bulboff);ledservice.setOff(0);} catch (RemoteException e) {Log.e(LOG_TAG, "Remote Exception while reading value from led service2.");}}}});}@Overridepublic 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;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);} } 代碼中我引用了圖片資源,如果讀者不想使用圖片,把含有圖片的代碼注釋掉就行了。也就不會報錯了。(9)主布局文件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="com.example.ledtest.MainActivity" ><ToggleButtonandroid:id="@+id/btnLed"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/imageLed"android:layout_alignRight="@+id/imageLed"android:layout_centerVertical="true"android:textOff="開燈"android:textOn="關燈" /><ImageViewandroid:id="@+id/imageLed"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/btnLed"android:layout_centerHorizontal="true"android:layout_marginBottom="22dp"android:src="@drawable/bulboff" /></RelativeLayout>(10)下面就可以編譯運行了。
我的編譯運行截圖如下:
關閉燈的狀態:
打開燈的狀態:
當然了,同時觀察開發板的LED燈狀態,跟這個是同步的。
二、Android源碼中編譯工程文件文件
這個比eclipse是簡單一些,不需要因為庫的問題頭疼。但是代碼的編寫可能沒有在eclipse下編譯時方便了,因為不知道哪里的代碼寫的有沒有錯誤,對于小工程來說還好,大的話,估計是個人都會瘋掉了。推薦使用上面的方法。
不過我這里還是簡單說一下方法。
這里我就直接使用上面eclipse編輯的代碼了,在Android源碼下編譯只需要res、src、AndroidManifest.xml、Android.mk、proguard.cfg、project.properties這幾個文件,其他都不需要拷貝。
當然這里是缺少Android.mk文件,下面給出源碼,拷貝保存一些即可:
TOP_LOCAL_PATH:= $(call my-dir)# Build activityLOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := LedTestLOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE)# ============================================================# Also build all of the sub-targets under this one: the shared library. include $(call all-makefiles-under,$(LOCAL_PATH))把上面說的文件都拷貝到Android源碼目錄/packages/apps/LedTest目錄下,或者讀者自己創建其他目錄。
然后在終端進入Android源碼根目錄使用mmm ./packages/apps/LedTest/進行編譯,完成后在out/target/product/realarm/system/app目錄下就會生成LedTest.apk文件,把該文件push到開發板測試一下,當然了,跟eclipse的效果是一樣的。
從eclipse拷貝源碼到Android目錄下編譯不會出錯的,大家放心好了,O(∩_∩)O~。
到此Android從底層到頂層的整個流程都記錄完畢了,讀者有什么疑問可以留言。能力有限,錯誤難免,大家見諒哈,勿噴。
總結
以上是生活随笔為你收集整理的s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s5p4418 Android 4.4.
- 下一篇: Android 4.4.2 动态添加JN