2007-03-08

举例说明jni调用c/c++接口

首先在eclipse中建立一个java工程StatisticJNIProject,设置好必要的参数(主要是输出目录,好找到你编译后的class文件位置:-)),在根目录(一般是src目录,注意是根目录,也就是程序中没有package,原因后边再说)下建立SITStatistic.java文件(当然,文件名可以随便取了)。文件内容如下:
/*
* Created on 2006-8-22
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class SITStatistic {
static {
System.loadLibrary("Tjni");
}
public native void doStatistic();
public static void main(String[] args) {
SITStatistic hh = new SITStatistic();
hh.doStatistic();
//System.getProperties();
//System.out.println(System.getProperties());
}
}
接下来编译工程,会得到SITStatistic.class文件(如果不用开发环境也可以直接用javac命令便宜文件SITStatistic.java,反正目标是生成SITStatistic.class文件)。
启动命令行(开始->运行 cmd.exe),将当前目录转到SITStatistic.class所在目录,执行javah SITStatistic 命令(注意,不是javah SITStatistic.class,没有扩展名),系统将在当前目录下生成SITStatistic.h文件。这个文件正是c++需要实现的头文件。
到此,这个简单的例子的java部分已经全部实现完成了。我们接下来转到c++部分。
首先在%JAVA_HOME%/include文件夹及其子文件夹下找到jni.h,jawt_md.h,jni_md.h三个文件,将他们拷贝到 Visual Studio安装目录\VC\include 目录下(其他的开发环境只要能保证编译是能找到这写头文件即可)。

建立vc的工程 new->project 点Visual C++下的Win32,选择Win32 Project。填写项目名称TJni,点OK。在Application Settings中设置Application Type 为DLL,Application options 为Empty project,点OK,工程就算建好了。说了一堆,其实就是建一个基本的动态链接库工程。然后把我们之前生成的SITStatistic.h文件加入到Tjni工程中,在工程中建立一个.cpp文件来实现SITStatistic.h中的方法,具体代码如下:
#define _Included_SITStatistic
#include
#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: SITStatistic

* Method: doStatistic

* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT void JNICALL Java_SITStatistic_doStatistic
(JNIEnv *, jobject)

{
cout<< "Hello World!";
return;

}

#ifdef __cplusplus

}

#endif

#endif


生成工程,会得到TJni.dll文件。把该文件考到SITStatistic.class文件所在的文件夹,执行SITStatistic.class文件,有可能你就成功了.

没有评论: