15.3.3. C 函数实现
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);
}
- 导入头文件com_marakana_FibLib.h。这个文件是前面通过javah -jnicom.marakana.FibLib命令生成的。
- 菲波那契算法的递归实现,与 Java 中的版本很相似。
- 菲波那契算法的迭代实现。
- JNI中定义的接口函数,与com_marakana_FibLib.h的函数签名相对应。在这里我们为它加上变量名,然后调用前面定义的C函数。
- 同上。
菲波那契算法的C部分已经实现,接下来就是构建共享库了。为此,我们需要一个合适的Makefile。