文章目录

参照网上演试了JNI的编写,记录下基本步骤。参看的主要文章为http://www.cnblogs.com/youxilua/archive/2011/09/16/2178554.html。

目标是实现斐波纳契函数。

  1. 编写java文件, 在方法声明前添加关键字native,无方法主体。然后用javac编译为.class文件。
1
2
3
4
package com.topd;
public class Fibonacci {
public native int cal3(int num);
}
  1. 使用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
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_topd_Fibonacci */
#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
  1. 完成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)路径添加到工程里。

config type

additional include dir

additional library dir

  1. 修改java 文件 , 使用static 块加载动态链接库
1
2
3
4
5
6
public class Fibonacci {
static {
System.loadLibrary("JniDll");
}
public native int cal3(int num);
}
文章目录