歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android+NDK 入門備忘 Ubuntu 11.10

開始使用 Android NDK 進行開發,NDK 的主要原理還是 JNI 技術,這一技術實現了 Java代碼和 C/C++代碼間的相互調用,這樣做的好處是:首先,將一些比較耗時的操作放到底層來實現,畢竟C和C++的效率高比Java高,並且指針是可以加快程序的運行速度;其次. 在C語言領域,已經有很多成熟的類庫和框架,使用NDK後,可以直接使用他們,因而避免再用Java去重復制造輪子。

Android NDK的開發,需要Linux的編譯環境,所以建議直接裝個Linux系統,在上面進行Android開發,當然也可以使用虛擬機來代替,不過個人覺得虛擬機始終不倫不類,還是真正的Linux環境比較順手。

使用NDK時的大致步驟如下:

1.  新建一個Android 工程,在裡面新建一個jni 文件夾,專門用來存放 C 語言程序和Android.mk 文件;

2.  在java文件中編寫一個 native 函數:

 

  1. package tangyuchun.ndk.hellojni;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6.   
  7. public class HellojniActivity extends Activity {  
  8.     static {  
  9.         System.loadLibrary("hello-jni");  
  10.     }  
  11.   
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.   
  15.         TextView tv = new TextView(this);  
  16.         tv.setText(getString());// 調用了native方法   
  17.         setContentView(tv);  
  18.     }  
  19.   
  20.     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,打開這個頭文件,內容如下:

 

  1. #include <jni.h>   
  2. /* Header for class tangyuchun_ndk_hellojni_HellojniActivity */  
  3.   
  4. #ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity   
  5. #define _Included_tangyuchun_ndk_hellojni_HellojniActivity   
  6. #ifdef __cplusplus   
  7. extern "C" {  
  8. #endif   
  9. /* 
  10.  * Class:     tangyuchun_ndk_hellojni_HellojniActivity 
  11.  * Method:    getString 
  12.  * Signature: ()Ljava/lang/String; 
  13.  */  
  14. JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString  
  15.   (JNIEnv *, jclass);  
  16.   
  17. #ifdef __cplusplus   
  18. }  
  19. #endif   
  20. #endif 

5.  看到裡面有一個函數: JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);

這個方法就與第2步的getString()對應。

6.  在jni 文件夾中新建一個 c語言文件,我的是 hello-jni.c ,include相應的頭文件,然後將第4步中的那個方法復制,完成該方法:

 

  1. #include <string.h>   
  2. #include <stdio.h>   
  3. #include <android/log.h>   
  4. #include <stdlib.h>   
  5. #include <jni.h>   
  6.   
  7. JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(  
  8.   JNIEnv *env, jclass thiz) {  
  9.  return (*env)->NewStringUTF(env, "Some say love");  
  10.         //這裡只是做個樣例,所以只讓他返回一段字符串 "Some say love"   

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

 

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := hello-jni  
  6. LOCAL_SRC_FILES := hello-jni.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  

那個LOCAL_MODULE 就是將要生成的.so 文件名,LOCAL_SRC_FILES就是第6步中編寫的 .c 文件。

8.  保存上述文件,打開終端,定位到工程的目錄下的jni 文件夾,在終端輸入: ndk-build 命令,回車。

9.  返回到工程文件夾下,就會看到生成了兩個文件夾 libs 和 obj,其中 libs/armeabi/ 文件夾下面就有 一個libhello-jni.so文件,這

個.so文件其實就是用來在android中調用C語言的類庫;

10. 在Android虛擬機上運行上面建立的工程,如下所示:

Copyright © Linux教程網 All Rights Reserved