• Android NDK入门实例 计算斐波那契数列一生成jni头文件


    最近要用到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 __cplusplus
    extern "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
    


     

  • 相关阅读:
    1010 幂次方
    1316 丢瓶盖
    1182 数列分段2
    Mysql动态SQL语句标签
    知了CMS开发说明文档(ibeetl) 建站系统文档
    BeanUtils.populate()的用法
    如何将网页的title前面的图标替换成自己公司的图标
    HTTP、HTTPS常用的默认端口号
    项目的xml文件中经常使用的sql语句
    Invalid bound statement(not found): com.xxx.xxx.xxx.xxxMapper.save
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3188431.html
Copyright © 2020-2023  润新知