Android NDK初探 你也可以做移动开发

移动开发 Android
本文将为各位详细介绍Android NDK的安装、使用和实战。由浅入深,你也可以成为一名Android开发者!

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. }    
  5.    
  6.  

然后在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.     
  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里面调用:

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.  

运行,得到结果distance(a,b):2.828427

源码参见附件 。

【编辑推荐】

  1. Android平台值得关注的开源项目 
  2. Android系统搜索对话框设计妙招 
  3. Android开发之WebView组件的使用详解 
责任编辑:佚名 来源: Javaeye论坛
相关推荐

2012-03-16 13:43:29

2010-10-09 15:01:27

PhoneGapiPhoneAndroid

2021-06-16 09:10:29

APP开发AndroidiOS

2011-06-16 10:25:29

AndroidAIR

2019-06-28 12:34:34

Python情感分析NLP

2010-08-03 10:32:42

Android 3.0Android 3.0Android开发

2013-01-16 15:07:30

Android NDKAndroid开发

2022-07-21 10:02:47

SonarQube代码Java

2013-12-27 09:54:58

Android开发NDK

2010-08-18 09:23:19

Flash Lite移动应用程序开发

2011-01-11 11:35:17

jQueryAndroidgoogle

2014-07-30 16:43:49

Android

2010-08-23 08:26:12

Android超算

2012-10-08 10:18:11

2009-10-30 10:45:45

ScalaEclipseAndroid

2019-01-15 14:41:06

数据分析新闻联播统计分析

2015-10-10 10:52:53

移动游戏开发

2014-03-31 15:32:36

AndroidNDK开发

2011-08-02 11:06:55

2014-10-22 13:37:44

开发者程序员
点赞
收藏

51CTO技术栈公众号