网上也有一些对NDK的介绍,不过都是很简单的把sample里面的例子讲解一下,并不深入,我这里把我的所得分享一下。我下载的是Android Native Developer Kit (NDK) R4版本,当前的最新版。
下载地址如下:
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对象,

public class Point {float x;float y;}

然后在c文件中定义一个函数

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对象。


首先确定要做的步骤:
1.找到这个Point类
2.找到类中的域x和y的域id
3.根据ID取出x和y的值
4.计算结果并返回
那么代码如下:

#include <jni.h>#include <math.h>#include <android/log.h>jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){        //步骤1jclass point_class = (*env)->FindClass(env, "chroya/demo/ndk/Point");if(point_class == NULL) {//printf("class not found");__android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "class Point not found");return 0;} else {__android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "found class Point");}        //步骤2jfieldID field_x = (*env)->GetFieldID(env, point_class, "x", "F");jfieldID field_y = (*env)->GetFieldID(env, point_class, "y", "F");        //步骤3jfloat ax = (*env)->GetFloatField(env, a, field_x);jfloat ay = (*env)->GetFloatField(env, a, field_y);jfloat bx = (*env)->GetFloatField(env, b, field_x);jfloat by = (*env)->GetFloatField(env, b, field_y);        //步骤4return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));}

然后在Java里面调用:

public class Main extends Activity {       @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView tv = new TextView(getApplicationContext());        Point a = new Point();        a.x = 3;        a.y = 3;                Point b = new Point();        b.x = 5;        b.y = 5;                float d = distance(a,b);        tv.setText("distance(a,b):"+d);        setContentView(tv);    }        public native float distance(Point a, Point b);        static {    System.loadLibrary("demo");    }}

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

源码参见附件

摘自:http://www.iteye.com/topic/729133

更多相关文章

  1. Android打开系统文件管理器
  2. Android(安卓)SharedPreferences 的 getsharedpreference(name,m
  3. Android(安卓)studio如何生成aar包
  4. 一步一坑学android之禁用Appt2(andriod studio3.0)
  5. Android镜像文件ramdisk.img,system.img,userdata.img介绍
  6. AndroidStudio快捷键
  7. 尝试用android-logging-log4j去实现log输出内容到sd卡中的文件的
  8. Android应用程序发布到Google Play
  9. Alibaba-AndFix Bug热修复框架原理及源码解析

随机推荐

  1. Android 开发日志之仿三星Launcher
  2. Android限定EditText的输入类型为数字或
  3. 实例收藏Android开发环境搭建和Android开
  4. Delphi XE5 for Android (六)
  5. github上十二款最著名的Android播放器开
  6. Android广播机制:Broadcast
  7. android 控件学习---------GridView
  8. Android模拟器 本地电脑上网配置 详解
  9. Spinner的使用方法
  10. DownloadManager使用