謹以此文紀念一個多月的努力。
Android的應用平台與Linux的核心之間有那麼幾層,1.c++架構2.JAVA 架構。一個月前,突然發現Android下的錄音無法使用,不管是內建的程式還是網上下載的程式都無法使用,調試核心發現,參數傳遞錯誤,開始以為是Linux的核心出錯,使用Linux下的aplay可以錄音而錄音軟體不可以使用,使用錄音軟體時發現傳遞的stream為0,而不是1.所以開啟的裝置是playback而不是capture裝置,為了這一步就花了一個星期的時間去查看Linux的源碼。其後準備去看Linux kernel與應用程式間的互動,發現者中間還有opencore層。一堆的JAVA以及C++,憑我那淺陋的C語言是很難理解的。不得不放棄,然後瞭解到還有ndk這個東東,就動心了,因為Linux下的aplay是可以使用的,我把它做成一個so庫留給上層調用就行了。化了兩三天把eclipse sdk ndk 等等windows下的android
開發環境裝好後,就開始了ndk的的so庫之旅。功夫不負有心人,so庫的模型做好了,下面就等著填東西了。
下面咱從android
開發環境安裝開始說吧。
1. eclipse安裝
下一個eclipse-java-helios-SR1-win32.zip 解壓即可,不過這個東西需要安裝java開發環境,java安裝也很簡單下載一個jre-6u23-windows-i586.exe 以及jdk-6u23-windows-i586.exe點擊安裝就可以了。有時候在開啟eclipse時會提示一些錯誤,其實有可能是沒有jre檔案夾,copy
java安裝檔案下jdk檔案中jre檔案夾複製到eclipse的檔案夾下即可。
2. sdk 安裝
下載一個android-sdk_r08-windows.zip解壓即可。一般情況下還需要將其路徑加入環境變數中,不加也可以。區別是如果加了,在eclipse中建立的android的虛擬器會放在該檔案夾下,名字為.android,如果不加的話,會在C:/Documents and Settings/使用者名稱 下,有些錯誤的原因就是使用者名稱為漢字。
3. 添加PATH
我的電腦->屬性->進階->環境變數->建立
變數名 JRE_HOME 變數值 C:/Program Files/Java/jre6
變數名 JAVA_JRE_HOME變數值 C:/Program/Files/Java/jdk1.6.0_13/jre
變數名 JAVA_HOME 變數值 C:/Program Files/Java/jdk1.6.0_23
變數名 CLASSPATH
變數值
.;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar;%JRE_HOME%/lib;%JRE_HOME%/lib/rt.jar;%JAVA_JRE_HOME%/lib;%JAVA_JRE_HOME%/lib/rt.jar
變數名 Android_SDK_HOME 變數值D:/Android/source/android-sdk-windows
4. eclipse中的安裝adt外掛程式
開啟eclipse後 help->install new software->add
name任意,location中為 http://dl-ssl.google.com/android/eclipse,然後就一路next就ok了。安裝後在主介面上file->new->project中有Android選項就ok了。不過還需要配置sdk為位置,在windows->preferences中的android一項中點擊browse選擇sdk放置的位置就可以了。
5. ndk安裝
下載cygwinsetup.zip
和android-ndk-r5-windows.zip注意了android-ndk-1.6_r1-windows.zip下沒有ndk-build,這個版本的我不知道怎麼編譯就換了一個高版本的。安裝cygwinsetup,一路next後選擇一個比較近的網站下載,在選擇下載安裝哪些軟體時,全部選擇Install就行了,反正時間不是太長(我下了一個晚上,嘿嘿!!)。然後就ok了,在案頭上會有一個cygwin的表徵圖,開啟後,類似一個終端。在這裡需要設定ndk的路徑,因為你以後會用很多次的。採用vi /etc/skel/.bashrc 在最後添加
NDK=/cygdrive/xxx/xxx
PATH=$PATH:$NDK
export NDK
退出,然後source /etc/skel/.bashrc 就可以了,你在命令列中輸入
$NDK 應該會開啟ndk所在的檔案夾
6. adb安裝
下載一個adb壓縮檔,解壓,把裡面的兩個檔案copy到windows/system32下即可。在start->運行 cd c:/ windows/system32然後就可以使用adb 了。
7. 如何建立一個Android工程
建立一個android 的工程需要建立一個avd,主介面windws->Android
SDK and AVD Manager –>new.
Name :avdtest
Target :Android
2.1
SD Card :400
Mb
Creat avd後。會在主介面中羅列出可用的avd了。
8. 建立一個android
的工程
File->new->project->Android->Android
project 然後next,
Project name :隨意
Build Target :選擇虛擬機器
Application name :隨意
下面的幾個那麼都隨意。注意Min sdk version 可以是1~9值,如果是Android
2.1的話,最高為7. Finish 就可以了。然後在主介面上點擊Run就可以運行了。
9. Adb使用
1. 在進入system32後運行adb
shell 可以進入正在啟動並執行Android的系統終端。
2. Adb push 向Android系統中寫入東西,一般第一次會提示Read-Only filesytem ,這就需要adb shell進入終端後,輸入
mount –o remount
/dev/block/mtdblock /system就可以了。
如果出現out–memory
則cmd中輸入 emulator –avd
avdname –partition-size 128,注意了,如果提示說沒有emulator的命令,則需要設定環境變數,上面偷懶了,下面就不行了。
3. adb pull 可以將android系統內的東西輸出。
如adb pull /data/app/com.examples.apk d:/android/apk
10. so庫的建立
1. 在剛才建立的工程下,建立一個folder,name 為jni,在jni下建立兩個檔案,一個是Android.mk,一個是hello.c。
2. 在Android.mk中輸入
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
LOCAL_LDLIBS := -ldl
-llog #添加系統的so檔案
LOCAL_LDLIBS += -L./ -lasound #添加本地的so檔案 -L為so庫的路徑,這個在調用別人的so庫,並且有標頭檔的情況下加快開發速度。
include $(BUILD_SHARED_LIBRARY)
3. 在hello.c中添加
#include <string.h>
#include
<jni.h>
#include
<dlfcn.h>
#include
<android/log.h>
jint
Java_com_hello_hello_hello(JNIEnv* env,jobject this)
{
return 12;
}
注意:以上的函數命名為com.hello為包名即是建立android工程時,package
name,
第二個hello為application name ,這個必須要和工程相互對於。第三個hello就是你打算在java中調用的函數名。修改src下的hello.java
package com.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class hello extends Activity {
/**
Called when the activity is first created. */
@Override
public
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
TextView tv = new TextView(this);
tv.setText("hello 調用是否成功:" + hello());
setContentView(tv);
}
public
native int hello();
static
{
System.loadLibrary("hello");
}
}
如果以上都沒有錯的話,點擊run就可以了,然後再android虛擬機器上會出現” hello 調用是否成功: 12”。Ok!有個小竅門,一般人不告訴他就是,沒有對檔案改動時,注意點擊refrresh,不行的話注意,點擊主介面上的project->clean