eclipseandroidndk
❶ 如何在Android下使用JNI
1.引言
我們知道,Android系統的底層庫由c/c++編寫,上層Android應用程序通過java虛擬機調用底層介面,銜接底層c/c++庫與Java應用程序間的介面正是JNI(JavaNative Interface)。本文描述了如何在ubuntu下配置AndroidJNI的開發環境,以及如何編寫一個簡單的c函數庫和JNI介面,並通過編寫Java程序調用這些介面,最終運行在模擬器上的過程。
2.環境配置
2.1.安裝jdk1.6
(1)從jdk官方網站下載jdk-6u29-linux-i586.bin文件。
(2)執行jdk安裝文件
[html] view plainprint?
01.$chmod a+x jdk-6u29-linux-i586.bin
02.$jdk-6u29-linux-i586.bin
$chmod a+x jdk-6u29-linux-i586.bin
$jdk-6u29-linux-i586.bin
(3)配置jdk環境變數
[html] view plainprint?
01.$sudo vim /etc/profile
02.#JAVAEVIRENMENT
03.exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
04.exportJRE_HOME=$JAVA_HOME/jre
05.exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
06.exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
$sudo vim /etc/profile
#JAVAEVIRENMENT
exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
exportJRE_HOME=$JAVA_HOME/jre
exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
保存後退出編輯,並重啟系統。
(4)驗證安裝
[html] view plainprint?
01.$java -version
02.javaversion "1.6.0_29"
03.Java(TM)SE Runtime Environment (build 1.6.0_29-b11)
04.JavaHotSpot(TM) Server VM (build 20.4-b02, mixed mode)
05.$javah
06.用法:javah[選項]<類>
07.其中[選項]包括:
08.-help輸出此幫助消息並退出
09.-classpath<路徑>用於裝入類的路徑
10.-bootclasspath<路徑>用於裝入引導類的路徑
11.-d<目錄>輸出目錄
12.-o<文件>輸出文件(只能使用-d或-o中的一個)
13.-jni生成JNI樣式的頭文件(默認)
14.-version輸出版本信息
15.-verbose啟用詳細輸出
16.-force始終寫入輸出文件
17.使用全限定名稱指定<類>(例
18.如,java.lang.Object)。
$java -version
javaversion "1.6.0_29"
Java(TM)SE Runtime Environment (build 1.6.0_29-b11)
JavaHotSpot(TM) Server VM (build 20.4-b02, mixed mode)
$javah
用法:javah[選項]<類>
其中[選項]包括:
-help輸出此幫助消息並退出
-classpath<路徑>用於裝入類的路徑
-bootclasspath<路徑>用於裝入引導類的路徑
-d<目錄>輸出目錄
-o<文件>輸出文件(只能使用-d或-o中的一個)
-jni生成JNI樣式的頭文件(默認)
-version輸出版本信息
-verbose啟用詳細輸出
-force始終寫入輸出文件
使用全限定名稱指定<類>(例
如,java.lang.Object)。2.2.安裝android應用程序開發環境
ubuntu下安裝android應用程序開發環境與windows類似,依次安裝好以下軟體即可:
(1)Eclipse
(2)ADT
(3)AndroidSDK
與windows下安裝唯一不同的一點是,下載這些軟體的時候要下載Linux版本的安裝包。
安裝好以上android應用程序的開發環境後,還可以選擇是否需要配置emulator和adb工具的環境變數,以方便在進行JNI開發的時候使用。配置步驟如下:
把emulator所在目錄android-sdk-linux/tools以及adb所在目錄android-sdk-linux/platform-tools添加到環境變數中,android-sdk-linux指androidsdk安裝包android-sdk_rxx-linux的解壓目錄。
[plain] view plainprint?
01.$sudo vim /etc/profile
02.exportPATH=~/software/android/android-sdk-linux/tools:$PATH
03. exportPATH=~/software/android/android-sdk-linux/platform-tools:$PATH
$sudo vim /etc/profile
exportPATH=~/software/android/android-sdk-linux/tools:$PATH
exportPATH=~/software/android/android-sdk-linux/platform-tools:$PATH
編輯完畢後退出,並重啟生效。
2.3.安裝NDK
NDK是由android提供的編譯android本地代碼的一個工具。
(1)從androidndk官網http://developer.android.com/sdk/ndk/index.html下載ndk,目前最新版本為android-ndk-r6b-linux-x86.tar.bz2.
(2)解壓ndk到工作目錄:
[plain] view plainprint?
01.$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
02.$sudo mv android-ndk-r6b /usr/local/ndk
$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
$sudo mv android-ndk-r6b /usr/local/ndk
(3)設置ndk環境變數
[plain] view plainprint?
01.$sudo vim /etc/profile
02.exportPATH=/usr/local/ndk:$PATH
$sudo vim /etc/profile
exportPATH=/usr/local/ndk:$PATH
編輯完畢後保存退出,並重啟生效
(4)驗證安裝
[plain] view plainprint?
01.$ cd/usr/local/ndk/samples/hello-jni/
02.$ ndk-build
03.Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
04.Gdbsetup : libs/armeabi/gdb.setup
05.Install : libhello-jni.so => libs/armeabi/libhello-jni.so
$ cd/usr/local/ndk/samples/hello-jni/
$ ndk-build
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
3.JNI實現
我們需要定義一個符合JNI介面規范的c/c++介面,這個介面不用太復雜,例如輸出一個字元串。接下來,則需要把c/c++介面的代碼文件編譯成共享庫(動態庫).so文件,並放到模擬器的相關目錄下。最後,啟動Java應用程序,就可以看到最終效果了。
3.1.編寫Java應用程序代碼
(1)啟動Eclipse,新建android工程
Project:JNITest
Package:org.tonny.jni
Activity:JNITest
(2)編輯資源文件
編輯res/values/strings.xml文件如下:編輯res/layout/main.xml文件
我們在主界面上添加了一個EditText控制項和一個Button控制項。
(3)編輯JNITest.java文件
static表示在系統第一次載入類的時候,先執行這一段代碼,在這里表示載入動態庫libJNITest.so文件。
再看這一段:
[java] view plainprint?
01.privatenativeString GetReply();
privatenativeString GetReply();
native表示這個方法由本地代碼定義,需要通過jni介面調用本地c/c++代碼。
[java] view plainprint?
01.publicvoidonClick(View arg0) {
02.edtName.setText(reply);
03.}
publicvoidonClick(View arg0) {
edtName.setText(reply);
}
這段代碼表示點擊按鈕後,把native方法的返回的字元串顯示到EditText控制項。
(4)編譯工程,生成.class文件。
3.2.用javah工具生成符合JNI規范的c語言頭文件
在終端中,進入android工程所在的bin目錄
[plain] view plainprint?
01.$cd ~/project/Android/JNITest/bin
$cd ~/project/Android/JNITest/bin
我們用ls命令查看,可以看到bin目錄下有個classes目錄,其目錄結構為classes/org/tonny/jni,即classes的子目錄結構是android工程的包名org.tonny.jni。請注意,下面我們准備執行javah命令的時候,必須進入到org/tonny/jni的上級目錄,即classes目錄,否則javah會提示找不到相關的java類。
下面繼續:
[plain] view plainprint?
01.$cd classes
02.$javah org.tonny.jni.JNITest
03.$ls
04.org org_tonny_jni_JNITest.h
$cd classes
$javah org.tonny.jni.JNITest
$ls
org org_tonny_jni_JNITest.h
執行javahorg.tonny.jni.JNITest命令,在classes目錄下會生成org_tonny_jni_JNITest.h頭文件。如果不進入到classes目錄下的話,也可以這樣:
[plain] view plainprint?
01.$javah -classpath ~/project/Android/JNITest/bin/classesorg.tonny.jni.JNITest
$javah -classpath ~/project/Android/JNITest/bin/classesorg.tonny.jni.JNITest
-classpath 參數表示裝載類的目錄。
3.3.編寫c/c++代碼
生成org_tonny_jni_JNITest.h頭文件後,我們就可以編寫相應的函數代碼了。下面在android工程目錄下新建jni目錄,即~/project/Android/JNITest/jni,把org_tonny_jni_JNITest.h頭文件拷貝到jni目錄下,並在jni目錄下新建org_tonny_jni_JNITest.c文件,編輯代碼如下:
[cpp] view plainprint?
01.#include<jni.h>
02.#include<string.h>
03.#include"org_tonny_jni_JNITest.h"
04.
05.
06.JNIEXPORTjstring JNICALLJava_org_tonny_jni_JNITest_GetReply
07.(JNIEnv *env, jobject obj){
08.return(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
09.}
#include<jni.h>
#include<string.h>
#include"org_tonny_jni_JNITest.h"
JNIEXPORTjstring JNICALLJava_org_tonny_jni_JNITest_GetReply
(JNIEnv *env, jobject obj){
return(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
}
我們可以看到,該函數的實現相當簡單,返回一個字元串為:"Hello,JNITest"
3.4.編寫Android.mk文件
在~/project/Android/JNITest/jni目錄下新建Android.mk文件,android可以根據這個文件的編譯參數編譯模塊。編輯Android.mk文件如下:
[plain] view plainprint?
01.LOCAL_PATH:= $(call my-dir)
02.include$(CLEAR_VARS)
03.LOCAL_MODULE := libJNITest
04.LOCAL_SRC_FILES:= org_tonny_jni_JNITest.c
05.include$(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE := libJNITest
LOCAL_SRC_FILES:= org_tonny_jni_JNITest.c
include$(BUILD_SHARED_LIBRARY)
LOCAL_MODULE表示編譯的動態庫名稱
LOCAL_SRC_FILES 表示源代碼文件
3.5.用ndk工具編譯並生成.so文件
進入到JNITest的工程目錄,執行ndk-build命令即可生成libJNITest.so文件。
[plain] view plainprint?
01.$cd ~/project/Android/JNITest/
02.$ndk-build
03.Invalidattribute name:
04.package
05.Install : libJNITest.so => libs/armeabi/libJNITest.so
$cd ~/project/Android/JNITest/
$ndk-build
Invalidattribute name:
package
Install : libJNITest.so => libs/armeabi/libJNITest.so
可以看到,在工程目錄的libs/armeabi目錄下生成了libJNITest.so文件。
3.6.在模擬器上運行
(1)首先,我們把android模擬器啟動起來。進入到emulator所在目錄,執行emulator命令:
[plain] view plainprint?
01.$cd ~/software/android/android-sdk-linux/tools
02.$./emulator @AVD-2.3.3-V10 -partition-size 512
$cd ~/software/android/android-sdk-linux/tools
$./emulator @AVD-2.3.3-V10 -partition-size 512
AVD-2.3.3-V10表示你的模擬器名稱,與在Eclipse->AVDManager下的AVDName對應,-partition-size表示模擬器的存儲設備容量。
(2)接下來,我們需要把libJNITest.so文件拷貝到模擬器的/system/lib目錄下,執行以下命令:
[plain] view plainprint?
01.$cd ~/project/Android/JNITest/libs/armeabi/
02.$adb remount
03.$adb push libJNITest.so /system/lib
04.80 KB/s (10084 bytes in 0.121s)
$cd ~/project/Android/JNITest/libs/armeabi/
$adb remount
$adb push libJNITest.so /system/lib
80 KB/s (10084 bytes in 0.121s)
當在終端上看到有80 KB/s (10084 bytes in 0.121s)傳輸速度等信息的時候,說明拷貝成功。
(3)在終端上執行JNITest程序,這個我們可以在Eclipse下,右鍵點擊JNITest工程,RunAs->Android Application,即可在模擬器上啟動程序
❷ Android應用開發揭秘的圖書目錄
前言
第一部分 准備篇
第1章 Android開發簡介
1.1 Android基本概念
1.1.1 Android簡介
1.1.2 Android的系統構架
1.1.3 Android應用程序框架
1.2 OMS介紹
1.2.1 OPhone介紹
1.2.2 Widget介紹
1.3 小結
第2章 Android開發環境搭建
2.1 Android開發准備工作
2.2 開發包及其工具的安裝和配置
2.2.1 安裝JDK和配置Java開發環境
2.2.2 Eclipse的安裝與漢化
2.2.3 SDK和ADT的安裝和配置
2.3 創建第一個Android項目——HeUoAndroid
2.3.1 創建HelloAndroid項目
2.3.2 運行HelloAndroid及模擬器的使用
2.3.3 調試HelloAndroid
2.4 小結
第二部分 基礎篇
第3章 Android程序設計基礎
3.1 Android程序框架
3.1.1 Android項目目錄結構
3.1.2 Android應用解析
3.2 Android的生命周期
3.3 Android程序U設計
3.4 小結
第4章 用戶界面開發
4.1 用戶界面開發詳解
4.1.1 用戶界面簡介
4.1.2 事件處理
4.2 常用控制項應用
4.2.1 文本框(Textiew)
4.2.2 列表(ListView)
4.2.3 提示(T0ast)
4.2.4 編輯框(EditText)
4.2.5 單項選擇(RadioGroup、RadioButton
4.2.6 多項選擇(CheckBox)
4.2.7 下拉列表(Spinner)
4.2.8 自動提示(AutoComplete.TextⅥew)
4.2.9 日期和時間(DatePicker、TimePicker)
4.2.10 按鈕(Button)
4.2.1l 菜單(Menu)
4.2.12 對話框(Dialog)
4.2.13 圖片視圖(ImageView)
4.2.14 帶圖標的按鈕(ImageButton)
4.2.15 拖動效果(Gallery)
4.2.16 切換圖片(hmgeSwilcher)
4.2.17 網格視圖(GridView)
4.2.18 卷軸視圖(ScrollView)
4.2.19 進度條(ProgressBar)
4.2.20 拖動條(SeekBar)
4.2.21 狀態欄提示(Notification、NotificationManager)
4.2.22 對話框中的進度條(ProgressDialog)
4.3 界面布局
4.3.1 垂直線性布局
4.3.2 水平線性布局
4.3.3.相對布局(RelativeLayout)
4.3.4 表單布局(TableLayout)
4.3.5 切換卡(TabWidget)
4,4 小結
第5章 Android游戲開發
5.1 Android游戲開發框架
5.1.1 View類開發框架
5.1.2 SurfaceView類開發框架
5.2 Graphics類開發
5.5.1 Paint和Color類介紹
5.2.2 Canvas類介紹
5.2.3 幾何圖形繪制
5.2.4 字元串繪制
5.2.5 圖像繪制
5.2.6 圖像旋轉
5.2.7 圖像縮放
5.2.8 圖像像素操作
5.2.9 Shader類介紹
5.2.10 雙緩沖技術
5.2.11 全屏顯示
5.2.12 獲得屏幕屬性
5.3 動畫實現
5.3.1 Tween動畫
5.3.2 Frame動畫
5.3.3 GIF動畫播放
5.4 小結
第6章 Android數據存儲
6.1 Android數據存儲初探
6.2 數據存儲之Shared Preferences
6.3 數據存儲之Files
6.4 數據存儲之Network
6.5 Android資料庫編程
6.5.1 SQLite簡介
6.5.2 SQLite編程詳解
6.5.3 SQLiteOpenHelper應用
6.6 數據共享(ContentProviders)
6.7 小結
第7 章多媒體開發
7.1 多媒體開發詳解
7.1.1 Open Core
7.1.2 MediaPlayer
7.1.3 MediaRecorder
7.2 播放音樂
7.3 播放視頻
7.4 錄制歌曲
7.5 相機設置
7.6 鬧鍾設置
7.7 鈴聲設置
7.8 小結
第8章 網路與通信
8.1 網路通信基礎
8.1.1 無線網路技術
8.1.2 Android網路基礎
8.2 HTTP通信
8.2.1 HttpURLConnection介面
8.2.2 HttpClient介面
8.2.3 實時更新
8.3 Socket通信
8.3.1 Socket基礎
8.3.2 Socket應用(簡易聊天室)
8.4 網路通信的中文亂碼問題
8.5 WebKit應用
8.5.1 WebKjt概述
8.5.2 WebView瀏覽網頁
8.5.3 WebView與Javascript
8.6 WtFi介紹
8.7 藍牙
8.8 小結
第9章 Android特色開發
9.1 感測器
9.2 語音識別
9.3 GoogleMap
9.3.1 GoogleMap概述
9.3.2 准備工作
9.3.3 GoogleMapAPI的使用
9.3.4 定位系統
9.4 桌面組件
9.4.1 快捷方式
9.4.2 實時文件夾
9.4.3 Widget開發
9.5 賬戶管理
9.6 小結
第三部分 實例篇
第10章 Android應用開發實例
10.1 情境模式
10.2 文件管理器
10.3 通訊錄
10.4 音樂播放器
10.5 天氣預報
10.6 個人地圖
10.7 Widget日歷
10.8 小結
第11 章Android游戲開發實例
11.1 手機游戲開發簡介
11.2 游戲框架設計
11.3 地圖設計
11.4 主角設計
11.5 圖層管理器
11.6 游戲音效
11.7 游戲存檔
11.8 小結
第四部分 高級篇
第12章 AndroidOpenGL開發基礎
12.1 OpenGL簡介
12.2 多邊形
12.3 顏色
12.4 旋轉
12.5 3D 空間
12.6 紋理映射
12.7 光照和事件
12.8 混合
12.9 小結
第13章 AndroidOpenGL綜合應用
13.1 移動圖像
13.2.3D 世界
13.3 飄動的旗幟
13.4 顯示列表
13.5 霧
13.6 粒子系統
13.7 蒙版
13.8 變形
13.9 小結
第14章 游戲引擎實現
14.1 游戲引擎介紹
14.1.1 什麼是引擎
14.1.2 引擎的進化
14.1.3 常見的游戲引擎
14.1.4 Android游戲引擎
14.2 游戲引擎結構
14.2.1 游戲引擎原理
14.2.2 游戲引擎定位
14.2.3 游戲引擎框架
14.3 游戲引擎設計
14.3.1 游戲引擎結構和功能設計
14.3.2 游戲引擎設計注意事項
14.4 游戲引擎實現
14.4.1 Activity類實現
14.4.2 流程式控制制和線程
14.4.3 游戲對象與對象管理
14.4.4 圖形引擎
14.4.5 物理引擎
14.4.6 事件模塊
14.4.7 工具模塊
14.4.8 腳本引擎、音效模塊、網路模塊
14.5 小結
第15章 優化技術
15.1 優化的基本知識
15.1.1 如何書寫出優秀代碼
15.1.2 編程規范
15.2 程序性能測試
15.2.1 計算性能測試
15.2.2 內存消耗測試
15.3 初級優化
15.4 高級優化
15.5 Android高效開發
15.6 AndroidUI優化
15.7 其他優化
15.7.1 zipalign
15.7.2 圖片優化
15.8 小結
第五部分 擴展篇
第16章 Android NDK開發
16.1 AndroidNDK簡介
16.2 安裝和配置NDK開發環境
16.2.1 系統和軟體需求
16.2.2 NDK開發環境搭建
16.2.3 編譯第一個NDK程序
16.3 AndroidNDK開發
16.3.1 JNI介面設計
16.3.2 使用CC++實現本地方法
16.3 編譯CC++代碼
16.4 AndroidNDK中使用0penGL
16.5小結
第17章 Android腳本環境
17.1 Android腳本環境簡介
17.2 Android腳本環境安裝
17.3如何編寫Android腳本程序
17.4小結