`

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代码

 

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)
{
        //步骤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里面调用:

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

分享到:
评论

相关推荐

    androidndk环境搭建和入门教程

    本教程将指导你如何搭建Android NDK环境,并通过简单的入门实例开始你的NDK开发之旅。 首先,我们来看“Android NDK开发环境搭建”。在Windows系统上,你需要下载适合你操作系统的NDK版本,通常可以从Android开发者...

    JNI NDK 开发指南

    JNI(Java Native Interface)是Java平台的一个重要组成部分,它允许Java代码和其他语言写的代码进行交互。NDK(Native Development Kit)是Google...阅读这本书,将帮助你从基础到进阶,全面掌握JNI和NDK的使用技巧。

    android ndk

    - **进阶实践**:随着对NDK的理解加深,可以尝试集成更复杂的库,比如OpenCV、FFmpeg等。 - **性能优化**:学习如何使用性能分析工具(如systrace、perf等)来定位和优化瓶颈。 #### 六、文档与资源 - **官方文档*...

    Android高级进阶-高清-带目录

    10. **Android NDK与JNI**:讲述原生代码开发,如何使用C/C++进行性能关键部分的优化,以及如何通过JNI与Java代码交互。 11. **第三方库集成**:探讨如何选择和集成各种流行的开源库,如Retrofit、Dagger、...

    AndroidJNI实例

    总的来说,`AndroidJNI实例`是一个实用的学习资源,涵盖了从基础到进阶的JNI应用,帮助开发者将原生代码集成到Android应用中,提升应用性能,实现更复杂的功能。通过这个实例,开发者可以加深对Android系统工作原理...

    Android代码-NavigationBar

    我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》 我的视频课程(编码直播推流):《Android视频编码和直播推流》 标题导航栏,两三句代码即可实现 博客地址:...

    Android代码-BsDiffYwl5320

    我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》 我的视频课程(编码直播推流):《Android视频编码和直播推流》 BsDiffYwl5320 Linux差分库: BsDiffYwl5320.jar libBsDiffYwl5320.so Windows差分库...

    android开发资料大全

    Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程) 新手入门 会员贡献电子图书整理(内含PDF下载) ...

    android-native-development-kit-cookbook

    - **实践操作**:通过实例演示如何使用OpenGL ES进行2D和3D图形绘制。 - **性能优化**:给出一些建议来提高OpenGL ES的渲染速度和效率。 3. **多线程编程** - **理论基础**:解释多线程的基本概念和原理。 - **...

    testjni.rar_TestJni

    在“TestJni”这个例子中,我们看到了从Java调用C++代码的完整流程,这只是一个简单的开始,实际项目中可能涉及更复杂的类型转换、异常处理和多线程同步等问题,这些都是进阶JNI编程需要掌握的关键点。

    android教程

    6. **Android开发全集**:这个名字暗示了这是一部全面的教程集合,不仅包含基础内容,还可能包含高级主题,如自定义View、动画、NDK开发、JNI接口、Android Wear或Android TV等特定平台的开发。 通过这些教程的学习...

    Expert Android Studio.pdf

    - 性能优化是每个开发者都应该关注的重点,本章节通过具体的实例展示了如何进行内存分析、CPU 分析等,从而找出并解决性能瓶颈问题。 ### 4. 高级主题 #### 知识点概述: - **使用 Android NDK**:介绍了如何利用 ...

    android资料汇总

    以上这些资源涵盖了Android开发的基础知识、进阶技巧以及高级主题,无论是初学者还是有一定经验的开发者都能从中找到有价值的信息。通过这些资料的学习,开发者可以全面提升自己的Android开发能力,并且能够更好地...

    Android 应用程序开发(第2版)教材源码

    这些源码实例为开发者提供了实际操作的机会,有助于深入理解Android应用开发的各个方面,是初学者和进阶者不可多得的学习资源。通过逐个章节的实践,开发者可以逐步掌握Android开发的核心技术,并具备独立开发应用的...

    安卓开发神器,必读

    最后,书籍深入到Android高级开发技术,如NDK编程、性能优化、安全性和多窗口支持等,同时提供了丰富的调试技巧,帮助开发者定位和解决问题。 ### 实战代码与案例分析 全书贯穿了大量经过实际测试的代码示例,这些...

    Android官方开发教程中文版

    Android官方开发教程是Android开发者入门和进阶的重要资源,它涵盖了Android应用开发的各个方面,旨在帮助程序员理解并掌握Android...这份教程详尽地解释了每一个概念,并配有实例,是开发者自学和进阶的理想参考资料。

    Hello_Android_美Ed_Burnette著_张波等译(中文版)

    12. **进阶主题**:书中可能还会涵盖一些进阶主题,如第三方库的使用、Android NDK(原生开发工具包)以及性能优化技巧。 通过《Hello Android》,初学者将逐步建立起对Android开发的全面认识,不仅能够掌握基本的...

    【计算机专业-Andorid项目源码100套之】JNI编程指南

    4. **进阶主题**:可能涵盖了一些高级话题,如NDK构建系统CMake或Android.mk,以及如何使用JNI与OpenCV等库集成。 总之,这个资料包为学习和应用JNI提供了一套全面的指南,从基础到实践,帮助开发者将Java和C/C++的...

    Android 4 高级编程(第3版)

    本书是开发者掌握Android高级技术的重要参考资料,涵盖了从基础到进阶的各种主题,旨在帮助开发者充分利用Android平台的能力,创建功能丰富且用户体验优秀的应用程序。 1. **Android体系结构**:书中首先会介绍...

Global site tag (gtag.js) - Google Analytics