15.3.3. C 函数实现

优质
小牛编辑
138浏览
2023-12-01

15.3.3.C 函数实现

我们需要新建一个C文件来存放本地代码。简单起见,我们将这个文件命名为fib.c,和刚才生成的头文件保持一致,同样放置在jni目录中。右击jni目录,选择New→File,并保存为fib.c。

Note:

在你打开C文件时,Eclipse可能会调用外部编辑器而不是在自己的编辑窗口中打开。这是因为用于Java开发的Eclipse还没有安装C开发工具的支持。要解决这个问题,你可以通过Help→Install New Software为Eclipse安装C的开发工具支持,也可以通过右键菜单Open With→Text Editor强制在Eclipse中打开。

C版本的菲波那契算法与Java版本差异不大。下面就是fib.c中的代码:

例 15.2. jni/fib.c

#include "com_marakana_FibLib.h" /* */

/* Recursive Fibonacci Algorithm */

long fibN(long n) {

if(n<=0) return 0;

if(n==1) return 1;

return fibN(n-1) + fibN(n-2);

}

/* Iterative Fibonacci Algorithm */

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;

}

/* Signature of the JNI method as generated in header file */

JNIEXPORT jlong JNICALL Java_com_marakana_FibLib_fibN

(JNIEnv *env, jclass obj, jlong n) {

return fibN(n);

}

/* Signature of the JNI method as generated in header file */

JNIEXPORT jlong JNICALL Java_com_marakana_FibLib_fibNI

(JNIEnv *env, jclass obj, jlong n) {

return fibNI(n);

}

  1. 导入头文件com_marakana_FibLib.h。这个文件是前面通过javah -jnicom.marakana.FibLib命令生成的。
  2. 菲波那契算法的递归实现,与 Java 中的版本很相似。
  3. 菲波那契算法的迭代实现。
  4. JNI中定义的接口函数,与com_marakana_FibLib.h的函数签名相对应。在这里我们为它加上变量名,然后调用前面定义的C函数。
  5. 同上。

菲波那契算法的C部分已经实现,接下来就是构建共享库了。为此,我们需要一个合适的Makefile。