最近要用到Android NDK,调用本地代码。就学了下Android NDK,顺便与大家分享。下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码。以及比较本地代码与java代码的效率。

开发环境搭建见以前写的XP下搭建Android开发环境和XP下搭建AR开发环境,具体过程不再重复。这里主要介绍利用Android NDK调用本地代码,实现全过程。

一、新建Android Application

其它默认,Next直至Finish完成新建工程。

二、使用javah命令生成供本地调用的头文件

1.新建java文件(class),文件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;}//本地实现在这里定义本地C代码的函数原型static {System.loadLibrary("fib");}public static native long fibN(int n);//本地的递归实现public static native long fibNI(int n);//本地的迭代实现}

2.编译、运行
现在编译运行主要是在过程bin目录下生成类文件,用于javah命令生成jni头文件。运行后会在bin下生成class目录,下面在dos下生成jni头文件。

开始没有用-classpath classes 指明类所在的位置,提示错误,加上-classpath classes选项就ok了,可以看到成功生成了com_example_fiblib_FibLib.h。下面贴出com_example_fiblib_FibLib.h代码,这个自动生成的,不需要修改。

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_fiblib_FibLib */#ifndef _Included_com_example_fiblib_FibLib#define _Included_com_example_fiblib_FibLib#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_fiblib_FibLib * Method:    fibN * Signature: (I)J */JNIEXPORT jlong JNICALL Java_com_example_fiblib_FibLib_fibN  (JNIEnv *, jclass, jint);/* * Class:     com_example_fiblib_FibLib * Method:    fibNI * Signature: (I)J */JNIEXPORT jlong JNICALL Java_com_example_fiblib_FibLib_fibNI  (JNIEnv *, jclass, jint);#ifdef __cplusplus}#endif#endif


更多相关文章

  1. Android(安卓)下使用 JSON 实现 HTTP 请求
  2. 转:深入解读Linux与Android的相互关系
  3. Android(安卓)Camera的接口与架构介绍
  4. Android有用代码片断(五)
  5. 狂刷Android范例之2:剪贴板范例
  6. Android中MaterialDesign使用 (五)自定义Behavior实现UC顶栏效果
  7. Android与设计模式(4)外观/桥接/MVP
  8. Kotlin实现Android顶部导航栏与模块联动
  9. Android简易实战教程--第三十九话《Chronometer实现倒计时》

随机推荐

  1. Android支持AMDGPU显卡
  2. android BitmapFactory.Options参数介绍
  3. android sqlite 操作:rawQuery and execSQ
  4. Android启动流程分析(七) init.rc的解析
  5. 仿QQ设置字体大小自定义SeekBar
  6. Android(安卓)NDK移植libiconv和libxml2
  7. [图文]将cocos2d-x项目移植到android上
  8. Android——4.2 - 3G移植之路之 AT 通信
  9. Android解决多个Fragment切换时布局重新
  10. Android(安卓)动态权限申请的封装