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

来源:互联网 发布:suse linux 9 下载 编辑:程序博客网 时间:2024/05/09 12:19

上一篇生成了本地共享库文件,这一篇主要介绍如何在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;@Overrideprotected 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);}/*@Overridepublic 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之间,效果比较明显。

原创粉丝点击