Android NDK入門實例 計算斐波那契數列二生成.so庫文件

下面實現本地代碼,再用ndk-build編譯生成.so庫文件。由於編譯時要用到make和gcc,這裡很多人是通過安裝cygwin,搭建一個linux環境編譯。我是直接用Android NDK裡ndk-build工具編譯,沒有安裝cygwin,也能編譯。

一、編寫本地代碼fib.c

首先在過程fiblib下新建一個目錄jni,將上一篇生成的jni頭文件添加到這個目錄,接著在源碼目錄下新建文件fib.c:

文件jni/fib.c:

 

?#include "com_example_fiblib_FibLib.h" 
//遞歸的斐波那契算法 
long fibN(long n){ 
 if(n<0) 
  return 0; 
 if(n==1) 
  return 1; 
 return fibN(n-1)+fibN(n-2); 
} 
//迭代的斐波那契算法 
long fibNI(long n){ 
 long previous = -1; 
 long result = 1; 
 long i = 0; 
 int sum = 0; 
 for (i=0;i<=n;i++){ 
  sum = result + previous; 
  previous = result; 
  result = sum; 
 } 
 return result; 
} 
//與頭文件生成的JNI方法的簽名一致,否則運行時無法調用到本地代碼 
JNIEXPORT jlong JNICALL Java_com_example_fiblib_FibLib_fibN 
  (JNIEnv *env, jclass obj, jint n){ 
 return fibN(n); 
} 
JNIEXPORT jlong JNICALL Java_com_example_fiblib_FibLib_fibNI 
  (JNIEnv *env, jclass obj, jint n){ 
 return fibNI(n); 
} 

#include "com_example_fiblib_FibLib.h"
//遞歸的斐波那契算法
long fibN(long n){
 if(n<0)
  return 0;
 if(n==1)
  return 1;
 return fibN(n-1)+fibN(n-2);
}
//迭代的斐波那契算法
long fibNI(long n){
 long previous = -1;
 long result = 1;
 long i = 0;
 int sum = 0;
 for (i=0;i<=n;i++){
  sum = result + previous;
  previous = result;
  result = sum;
 }
 return result;
}
//與頭文件生成的JNI方法的簽名一致,否則運行時無法調用到本地代碼
JNIEXPORT jlong JNICALL Java_com_example_fiblib_FibLib_fibN
  (JNIEnv *env, jclass obj, jint n){
 return fibN(n);
}
JNIEXPORT jlong JNICALL Java_com_example_fiblib_FibLib_fibNI
  (JNIEnv *env, jclass obj, jint n){
 return fibNI(n);
}

二、編寫Makefile·

創建本地庫之前,需要編寫Android.mk,描述編譯項目

文件jni/Android.mk

 

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
 
LOCAL_MODULE    := fib 
LOCAL_SRC_FILES := fib.c 
 
include $(BUILD_SHARED_LIBRARY) 

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := fib
LOCAL_SRC_FILES := fib.c

include $(BUILD_SHARED_LIBRARY)三、編譯構建共享庫

這裡需要在jni下執行ndk-build生成庫文件,即在libs下生成共享庫libfib.so

右擊工程Refresh下,就看到生成瞭libfib.so

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *