By
Vika Zhou
更新日期:
文章目录
参照网上演试了JNI的编写,记录下基本步骤。参看的主要文章为http://www.cnblogs.com/youxilua/archive/2011/09/16/2178554.html。
目标是实现斐波纳契函数。
- 编写java文件, 在方法声明前添加关键字native,无方法主体。然后用javac编译为.class文件。
1 2 3 4
| package com.topd; public class Fibonacci { public native int cal3(int num); }
|
使用javah从.clas生成c的头文件,工具javah.exe位于%JDK_HOME%/bin.
javah.exe -classpath .\ com.topd.Fibonacci
生成的头文件名为com_topd_Fibonacci.h,如下为其内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <jni.h> #ifndef _Included_com_topd_Fibonacci #define _Included_com_topd_Fibonacci #ifdef __cplusplus extern "C" { #endif * Class: com_topd_Fibonacci * Method: cal3 * Signature: (I)I */ JNIEXPORT jint JNICALL Java_com_topd_Fibonacci_cal3 (JNIEnv *, jobject, jint); #ifdef __cplusplus } #endif #endif
|
- 完成c文件,编译为DLL动态链库
com_topd_Fibonacci.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <jni.h> #include "com_topd_Fibonacci.h" JNIEXPORT jint JNICALL Java_com_topd_Fibonacci_cal3 (JNIEnv *env, jobject obj, jint num) { long n0 = 0, n1 = 1, r, i; if (num <= 0) { return 0; } else if (num == 1) { return 1; } for (i = 2; i <= num; i++) { r = n0 + n1; n0 = n1; n1 = r; } return r; }
|
本人在windows下使用的编译器为MS VC++ 2010 Express. 新建solution后,需要将JDK下的include(%JDK_HOME%\include;%JDK_HOME%\include\win32)和lib(%JDK_HOME%\lib)路径添加到工程里。
- 修改java 文件 , 使用static 块加载动态链接库
1 2 3 4 5 6
| public class Fibonacci { static { System.loadLibrary("JniDll"); } public native int cal3(int num); }
|