android ndk入门学习

  Android的原生开发套件(NDK)是SDK的辅助工具,可以用它把Android应用的一部分或全部用本地代码实现。
 字节码需要由虚拟机解释,而本地代码可以由设备处理器直接执行,
 没有任何中间步骤,执行速度更快,有时快很多。
   使用本地代码和NDK的方式有以下两种:
 1)应用的一部分用Java编写,另一部分用c/c++编写。
 2)应用全部用C/C++写。

   我们用计算斐波那契数列来阐述android ndk的使用。
开发环境使用ADT,android 4.3版本。
计算斐波那契数列的方法有很多,我们这里选择其中的一种
    public static long IterativeFaster(int n) {
        if (n > 1) {
            long a, b = 1;
            n--;
            a = n & 1;
            n /= 2;
            while (n-- > 0) {
                a += b;
                b += a;
            }
            return b;
        }
        return n;
    }
 我们测试在4种情况下,计算斐波那契数列所用时间的统计。
 1)android 4.3默认的JIT环境
 2)android 4.3的 NO JIT环境,通过设置AndroidManifest.xml中android:vmSafeMode="true",禁止使用JIT。
 3)使用本地库(debug状态)。
 4)使用本地库(release状态)。

 对于如何生成本地库,这里不做介绍,网上已经很多了。使用的代码如下:
 1.Fibonacci.java
    public class Fibonacci {
    public static final String TAG = "TEST_FIBONACCI";
    private static final int ITERATIONS = 1000000;

    static {
        System.loadLibrary("fibonacci_debug");//加载本地库,在这里切换debug或者release版本的库
    }

    public static void testFibonacci(int n) {
        long time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            // 在这里切换4种条件下的调用函数
            //IterativeFaster(n);
            iterativeFasterNativeDebug(n);
        }
        time = System.currentTimeMillis() - time;
        Log.i(TAG, String.valueOf(n) + " >> Total time: " + time
                + " milliseconds");
    }

    public static void testFibonacci() {
        for (int i = 0; i < 92; i++) {
            testFibonacci(i);
        }
    }


    public static long IterativeFaster(int n) {
        if (n > 1) {
            long a, b = 1;
            n--;
            a = n & 1;
            n /= 2;
            while (n-- > 0) {
                a += b;
                b += a;
            }
            return b;
        }
        return n;
    }

    private static native long iterativeFasterNativeRelease(int n);//release时调用

    private static native long iterativeFasterNativeDebug(int n);//debug时调用

}
 通过javah命令可以生成本地c文件的头文件,
 使用ndk-build生成对应的库(要修改Android.mk和Application.mk中的配置)。
 在这里Fibonacci.java会生成相关的.h文件,然后再写相应的c文件。

 最后我们执行相关测试,得到的数据如下:

这里写图片描述

    横轴表示斐波那契数列0-91,纵轴表示时间。

这里写图片描述

 通过上面的图我们知道:
 根据网上的资料我们知道谷歌自己的测试结果显示,Dalvik JIT编译器可以让CPU密集型代码的性能提升5倍。
 另外在某些情况下,在旧设备上提供可接受的用户体验,使用本地代码是唯一的选择。
 本博客是参照《android性能优化》这本书学到的,仅供参考。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值