日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
AndroidNDK初探你也可以做移動開發(fā)

曾介紹Android開發(fā)WebView組件的使用詳解,本文將為各位詳細介紹Android NDK的安裝、使用和實戰(zhàn)。我下載的是Android Native Developer Kit (NDK) R4版本,當(dāng)前的最新版。

創(chuàng)新互聯(lián)基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺為眾多戶提供成都服務(wù)器托管 四川大帶寬租用 成都機柜租用 成都服務(wù)器租用。


Android NDK

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

我下面講的都是以linux環(huán)境為準,因為我的系統(tǒng)是linux的。windows下可以弄個Cygwin,模擬linux環(huán)境。

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

安裝: 

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

然后就是配置環(huán)境變量。

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

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

然后保存,重新打開bash。

使用: 

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

編譯的兩種方法:

1.進入要目標(biāo)工程目錄,比如$NDK_ROOT/samples/hello-jni,然后執(zhí)行$NDK_ROOT/ndk-build

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

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

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

進階: 

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

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

另外,1.5提供了log的API,在android/log.h里面,使用的時候,在c文件中#include ,然后在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。

實例: 

給出兩個點的坐標(biāo),求它們的距離。

首先,創(chuàng)建一個Point對象,

Java代碼 

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

然后在c文件中定義一個函數(shù)  

C代碼 

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

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

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

首先確定要做的步驟:

◆找到這個Point類

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

◆根據(jù)ID取出x和y的值

◆計算結(jié)果并返回

那么代碼如下:

Java代碼 

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

然后在Java里面調(diào)用:

Java代碼 

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

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

源碼參見附件 。

【編輯推薦】

  1. Android平臺值得關(guān)注的開源項目 
  2. Android系統(tǒng)搜索對話框設(shè)計妙招 
  3. Android開發(fā)之WebView組件的使用詳解 

本文題目:AndroidNDK初探你也可以做移動開發(fā)
本文地址:http://www.5511xx.com/article/dhcidhp.html