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" );
}
public static void testFibonacci (int n) {
long time = System.currentTimeMillis();
for (int i = 0 ; i < ITERATIONS; i++) {
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);
private static native long iterativeFasterNativeDebug (int n);
}
通过javah命令可以生成本地c文件的头文件,
使用ndk-build生成对应的库(要修改Android.mk和Application.mk中的配置)。
在这里Fibonacci.java会生成相关的.h文件,然后再写相应的c文件。
最后我们执行相关测试,得到的数据如下:
横轴表示斐波那契数列0-91,纵轴表示时间。
通过上面的图我们知道:
根据网上的资料我们知道谷歌自己的测试结果显示,Dalvik JIT编译器可以让CPU密集型代码的性能提升5倍。
另外在某些情况下,在旧设备上提供可接受的用户体验,使用本地代码是唯一的选择。
本博客是参照《android性能优化》这本书学到的,仅供参考。