`
熊滔爱孟涛静
  • 浏览: 121730 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

linux NDK实例

阅读更多

网上也有一些对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代码 复制代码 收藏代码
  1. NDK_ROOT=~/android-ndk-r4b #后面的路径是NDK所在的目录,根据自己的目录修改   
  2. export NDK_ROOT  
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. }  
public class Point {
	float x;
	float y;
}

 

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

C代码 复制代码 收藏代码
  1. jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){}  
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.计算结果并返回
    那么代码如下:

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. }  
#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)
{
        //步骤1
	jclass 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");
	}
        //步骤2
	jfieldID field_x = (*env)->GetFieldID(env, point_class, "x", "F");
	jfieldID field_y = (*env)->GetFieldID(env, point_class, "y", "F");
        //步骤3
	jfloat 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);
        //步骤4
	return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));
}

     然后在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. }  
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

      源码参见附件

分享到:
评论
1 楼 ihopethatwell 2012-02-17  
楼主,你能否写一个 int类型的一维数组的结构体?

相关推荐

    NDK配置及安装、生成.实例应用

    NDK配置及安装、生成.实例应用,里面参考博文实现。遇到很多坑,里面是完整的代码...有疑问的可以多评论

    Linux命令行下编译Android NDK的示例代码

    这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能...PATH=$PATH:/work/android/android-sdk-linux/platform-tools/:/work/android/android-sdk-linux/tools

    android NDK

    1.了解NDK,Android NDK带来什么 2.环境部署Windows xp Android NDK环境搭建 3.Ubuntu android NDK配置与开发 4.Android1.5 NDK Release 1 中文...8.实例分析与入门实例NDK自带实例分 9.NDK入门开发实战Ubuntu版本析

    AndroidStudio-NDK开发 编译c代码提供so库和jar包 另外一个app调用,实例源码

    AndroidStudio-NDK开发 编译c代码提供so库和jar包 另外一个app调用,实例源码

    hello-jni.tar.gz 实例

    该资源是hello-jni.tar.gz 实例,来源于android-ndk-r8e的sample。博主已经编译生成shared library,以备分析汇编文件使用。libs/armeabi目录下有博主生成的log.obj、log.elf、log.hex,分别由arm-robin-linux-...

    linux jsonc 例子

    1. 可以直接在ndk环境下编译 2. 纯c语言的json解析 3. 里面有个简单的例子,相关api很简单请查看cJSON.h说明

    Android底层开发实战

    内容包括NDK编程、Android中HAL模型架构与实现流程。作为教学实例,最后分析了Android系统中的Camera与WIFI两个功能部件的的驱动设计。第四部分为实例分析篇,通过对具体开发板硬件结构编程原理的介绍到系统级的实例...

    ARM Cortex-A8和Android 4.x联动报警系统

    第四部分,讲解了Linux设备驱动开发环境搭建、内核开发相关理论,然后将裸机下的接口驱动移植到Android环境下,并通过NDK和JAVA界面测试通过;第五部分,通过一个实战项目,综合应用各个模块的知识,为毕业设计 、...

    Android代码-BsDiffYwl5320

    Linux差分库: BsDiffYwl5320.jar libBsDiffYwl5320.so Windows差分库 BsDiffYwl5320.jar BsDiffYwl5320.dll Android合并库 BsPatchYwl5320Util.jar arm64-v8a/libBsPatchYwl5320.so armeabi/libBsPatchYwl5320.so ...

    Android 初学中阶高阶书籍_集合打包2

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

    Android 初学中阶高阶书籍_集合打包3

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

    nextouch_jni_demo.zip

    1、Android:配置NDK并编译JNI文件so库 APP调用jni源码实例 2、app调用jni接口。

    openscenegraph(osg)3.2.1rc1 android静态库 http://521.be

    编译结果为 include+obj的形式,dome实例参考官方源码包中的examples/osgAndroidExampleGLES1 或 examples/osgAndroidExampleGLES2,编译工程时把Android.mk文件中的OSG_ANDROID_DIR指向解压后的根目录即可正常编译...

    OpenGL ES 3.0编程指南第2版[中文][PDF]

    由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增功能,通过大量已经编译和测试过的实例,...第16章讨论如何为iOS 7、Android 4.3 NDK、Android 4.3 SDK、Windows和Linux构建OpenGL ES样板代码。

    ES2.0编程指南(中文版).pdf

    华章 OpenGL ES 3.0编程指南(原书第2版)由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增...第16章讨论如何为iOS 7、Android 4.3 NDK、Android 4.3 SDK、Windows和Linux构建OpenGL ES样板代码。

    Android基础知识详解

    五、Linux 内核 8 Webkit浏览器引擎简介 9 Dalvik虚拟机简介 11 什么是Dalvik虚拟机 11 Dalvik和Android系统 11 Dalvik虚拟机的主要特征 12 Android应用开发和Dalvik虚拟机 15 Activity生命周期 16 一、Activity栈 ...

Global site tag (gtag.js) - Google Analytics