Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android NDK初探 你也可以做移動開發

Android NDK初探 你也可以做移動開發

編輯:高級開發

51CTO曾介紹android開發WebVIEw組件的使用詳解,本文將為各位詳細介紹android NDK的安裝、使用和實戰。我下載的是android Native Developer Kit (NDK) R4版本,當前的最新版。

Android NDK
android NDK

下載地址如下: http://dl.google.com/android/ndk/android-ndk-r4b-Linux-x86.zip

我下面講的都是以Linux環境為准,因為我的系統是Linux的。Windows下可以弄個Cygwin,模擬Linux環境。

首先進入NDK目錄,有個README文件,裡面提到了API的文檔在docs/STABLE-APIS.TXT裡面,如何安裝NDK,參考docs/INSTALL.TXT,還有如何使用NDK,參考docs/HOWTO.TXT。建議這些文檔都看一遍,有個大概了解。

安裝:

INSTALL.TXT裡面講的是如何安裝,安裝NDK,就需要一個可以make環境,Linux自帶了,所以不用關心。還有一點,以前的版本都需要運行build/host-setup.sh來進行初始化,這個版本把它刪除了,這樣更方便。

然後就是配置環境變量。

在~/.bashrc文件裡面,添加Shell代碼

NDK_ROOT=~/android-ndk-r4b #後面的路徑是NDK所在的目錄,根據自己的目錄修改 export NDK_ROOT

然後保存,重新打開bash。

使用:

先拿sample試刀吧,剛開始什麼都不知道,只有運行出一個例子,才能增加信心。

編譯的兩種方法

1.進入要目標工程目錄,比如$NDK_ROOT/samples/hello-jni,然後執行$NDK_ROOT/ndk-build

2.在任何地方,執行$NDK_ROOT/ndk-build -C $NDK_ROOT/samples/hello-jni.

如果成功的話,會生成obj和libs兩個目錄。

選擇一種方法,編譯這個例子。然後打開eclipse,把hello-jni這個工程導入,運行,ok,就能看到效果了。

進階:

docs下的STABLE-APIS.TXT裡面講了系統API的用法。我以1.5為例。進入$NDK_ROOT/build/platforms/android-3/arch-arm/usr/include,裡面有很多.h文件,這些都是可以在NDK裡面調用的,除了Linux和asm目錄下的。

一般來說,主要用到的是jni.h,裡面提供了很多對類和對象的操作。

另外,1.5提供了log的API,在android/log.h裡面,使用的時候,在c文件中#include <android/log.h>,然後在android.mk裡面加上LOCAL_LDLIBS := -llog,就可以了。

1.6到2.01提供了openGL ES 1.x的API,2.1提供了openGL ES 2.0的API,2.2提供了graphics的處理接口。使用方法同log。

實例:

給出兩個點的坐標,求它們的距離。

首先,創建一個Point對象,

Java代碼

  1. public class Point {
  2. float x;
  3. float y;
  4. }

然後在c文件中定義一個函數

C代碼

  1. jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){}

返回值是float,在jni中定義的是jfloat。

函數名規則: Java開頭,接著是包名的每一段,然後是類名,最後是Java中調用的方法名,中間都用下劃線隔開。第一個參數JNIEnv* env和第二個參數jobject thiz都是必須的,後面的才是Java中傳遞進來的參數。這裡是兩個Point對象。

首先確定要做的步驟:

◆找到這個Point類

◆找到類中的域x和y的域id

◆根據ID取出x和y的值

◆計算結果並返回

那麼代碼如下:

Java代碼

  1. #include <jni.h>
  2. #include <math.h>
  3. #include <android/log.h>
  4. jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b)
  5. {
  6. //步驟1
  7. jclass point_class = (*env)->FindClass(env, "chroya/demo/ndk/Point");
  8. if(point_class == NULL) {
  9. //printf("class not found");
  10. __android_log_write(android_LOG_INFO, "MyNdkDemo", "class Point not found");
  11. return 0;
  12. } else {
  13. __android_log_write(android_LOG_INFO, "MyNdkDemo", "found class Point");
  14. }
  15. //步驟2
  16. jfIEldID fIEld_x = (*env)->GetFIEldID(env, point_class, "x", "F");
  17. jfIEldID fIEld_y = (*env)->GetFIEldID(env, point_class, "y", "F");
  18. //步驟3
  19. jfloat ax = (*env)->GetFloatField(env, a, fIEld_x);
  20. jfloat ay = (*env)->GetFloatField(env, a, fIEld_y);
  21. jfloat bx = (*env)->GetFloatField(env, b, fIEld_x);
  22. jfloat by = (*env)->GetFloatField(env, b, fIEld_y);
  23. //步驟4
  24. return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));
  25. }

然後在Java裡面調用:

Java代碼

  1. public class Main extends Activity {
  2. @Override
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. TextVIEw tv = new TextVIEw(getApplicationContext());
  6. Point a = new Point();
  7. a.x = 3;
  8. a.y = 3;
  9. Point b = new Point();
  10. b.x = 5;
  11. b.y = 5;
  12. float d = distance(a,b);
  13. tv.setText("distance(a,b):"+d);
  14. setContentVIEw(tv);
  15. }
  16. public native float distance(Point a, Point b);
  17. static {
  18. System.loadLibrary("demo");
  19. }
  20. }

運行,得到結果distance(a,b):2.828427

源碼參見附件 。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved