您的位置:首页 > 移动开发 > Android开发

Android NDK入门实例 计算斐波那契数列三在Android中调用本地库文件

2013-07-13 17:20 411 查看
上一篇生成了本地共享库文件,这一篇主要介绍如何在Android中调用本地代码。同时测试Android应用程序。改程序功能:输入一个数,分别运行4中算法计算出这个只对应的斐波那契数,同时将不同算法话费的时间显示出来。

一、编写FibLib.java和MainActivity.java

FibLib.java:

package com.example.fiblib;

public class FibLib {
//java的递归实现
public static long fibJ(long n){
if(n <= 0)
return 0;
if(n==1)
return 1;
return fibJ(n-1) + fibJ(n-2);
}
//java的迭代实现
public static long fibJI(long n){
long previous = -1;
long result = 1;
for(long i=0;i<=n;i++){
long sum=result+previous;
previous = result;
result = sum;
}
return result;
}
//本地实现
static {
System.loadLibrary("fib");
}
public static native void fibN(int n[]);	//本地的递归实现
public static native long fibNI(int n);	//本地的迭代实现
}

MainActivity.java:

package com.example.fiblib;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
//import android.view.Menu;

public class MainActivity extends Activity implements OnClickListener{
TextView textResult;
Button buttonGo;
EditText editInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取对UI view的引用
editInput = (EditText) findViewById(R.id.editInput);
textResult = (TextView) findViewById(R.id.textResult);
buttonGo = (Button) findViewById(R.id.buttonGo);
buttonGo.setOnClickListener(this);
}
public void onClick(View view){
int input = Integer.parseInt(editInput.getText().toString());

long start, stop;
long result;
String out = "";

//Dalvik 递归
start = System.currentTimeMillis();
result = FibLib.fibJ(input);
stop = System.currentTimeMillis();
out += String.format("Dalvik recursive: %d (%d msec)",result, stop - start);

//Dalvik 迭代
start = System.currentTimeMillis();
result = FibLib.fibJI(input);
stop = System.currentTimeMillis();
out += String.format("\nDalvik iterative %d (%d msec)",result, stop - start);

//本地  递归
start = System.currentTimeMillis();
result = FibLib.fibN(input);
stop = System.currentTimeMillis();
out += String.format("\nNative recursive: %d (%d msec)",result, stop - start);

//本地  迭代
start = System.currentTimeMillis();
result = FibLib.fibNI(input);
stop = System.currentTimeMillis();
out += String.format("\nNative iterative: %d (%d msec)",result, stop - start);

textResult.setText(out);
}
/*
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
*/
}

代码功能就是输入一个数,,分别运行4中算法计算出这个只对应的斐波那契数,同时将不同算法话费的时间显示出来。有注释,不清楚地方可以一起讨论。

二、编写主窗口布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<EditText
android:id="@+id/editInput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.38"
android:text="input" />

<Button
android:id="@+id/buttonGo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.68"
android:text="Go" />
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>

<TextView
android:id="@+id/textResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/linearLayout1"
android:layout_alignRight="@+id/linearLayout1"
android:layout_below="@+id/linearLayout1"
android:layout_marginTop="15dp"
android:text="result" />

</RelativeLayout>

这个我是在不局窗口拖得,然后自动生成的代码。

三、测试代码

编译OK后右击工程Run As/Android Application,运行结果如下:



输入30,可以看到本地运行速度快多了。由于计算是在Activity主UI线程中进行的,期间会影响到界面的响应,如果响应时间过长,就会出现程序无响应。建议输入数在25~30之间,效果比较明显。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: