Android+NDK 入門備忘 ubuntu 11.10

來源:互聯網
上載者:User

  開始使用 Android NDK 進行開發,NDK 的主要原理還是JNI技術,這一技術實現了 Java代碼和 C/C++代碼間的相

互調用,這樣做的好處是:

    a. 將一些比較耗時的操作放到底層來實現,畢竟C和C++的效率高比Java高,並且指標是可以加快程式的運行速度;

    b. 在C語言領域,已經有很多成熟的類庫和架構,使用NDK後,可以直接使用他們,因而避免再用Java去重複製造輪子。

 

      Android NDK的開發,需要Linux的編譯環境,所以建議直接裝個Linux系統,在上面進行Android開發,當然也可以使用

虛擬機器來代替,不過個人覺得虛擬機器始終不倫不類,還是真正的Linux環境比較順手。

     使用NDK時的大致步驟如下:    1.建立一個Android 工程,在裡面建立一個jni 檔案夾,專門用來存放 C 語言程式和Android.mk 檔案    2.在java檔案中編寫一個 native 函數
View Code package tangyuchun.ndk.hellojni;public class HellojniActivity extends Activity { static {  System.loadLibrary("hello-jni"); } public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  TextView tv = new TextView(this);  tv.setText(getString());//調用了native方法  setContentView(tv); } public native static String getString();}
這裡是一個簡單的Activity介面,裡面定義了一個 getString()方法,用來擷取一個字串。 3.開啟終端,使用 javah -classpath 命令編譯 bin/classes 下產生的 .class檔案。我的命令如下:?
javah
-classpath
/home/administrator/android_code/hello-jni/bin/classes
tangyuchun.ndk.hellojni.HellojniActivity
 也可以在src的 .java 原始碼中使用同樣的命令:
javah -classpath /home/administrator/android_code/hello-jni/src tangyuchun.ndk.hellojni.HellojniActivity

記得在前面要加上包名(我的是在tangyuchun.ndk.hellojni這個包下面)

 4.經過第3步後,就會在該類目錄下產生一個 .h 的標頭檔(ubuntu也有可能產生在主資料夾下面),名字為 tangyuchun_ndk_hellojni_HellojniActivity.h,開啟這個標頭檔,內容如下

View Code #include <jni.h>/* Header for class tangyuchun_ndk_hellojni_HellojniActivity */#ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity#define _Included_tangyuchun_ndk_hellojni_HellojniActivity#ifdef __cplusplusextern "C" {#endif/* * Class:     tangyuchun_ndk_hellojni_HellojniActivity * Method:    getString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString  (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
5.看到裡面有一個 函數:JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);這個方法就與第2步的getString()對應。 6.在jni 檔案夾中建立一個 c語言檔案,我的是 hello-jni.c ,include相應的標頭檔,然後將第4步中的那個方法複製,完成該方法:
View Code #include <string.h>#include <stdio.h>#include <android/log.h>#include <stdlib.h>#include <jni.h>JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(  JNIEnv *env, jclass thiz) { return (*env)->NewStringUTF(env, "Some say love");        //這裡只是做個範例,所以只讓他返回一段字串 "Some say love"}

注意,要給方法添加參數,標頭檔中只是聲明,並沒有實參。 7.同樣,在 jni 檔案夾下面建立一個 Android.mk 檔案,內容如下

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jniLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY)

那個LOCAL_MODULE 就是將要產生的.so 檔案名稱,LOCAL_SRC_FILES就是第6步中編寫的 .c 檔案。 8.儲存上述檔案,開啟終端,定位到工程的目錄下的jni 檔案夾,在終端輸入: ndk-build 命令,斷行符號。 9.返回到工程檔案夾下,就會看到產生了兩個檔案夾 libs 和 obj,其中 libs/armeabi/ 檔案夾下面就有三個檔案,分別是gdb.setup,gdbserver  和libhello-jni.so檔案,這個.so檔案其實就是用來在android中調用C語言的類庫 10. 在Android虛擬機器上運行上面建立的工程,如下所示                                                       

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.