2012年(8)
分类: IT业界
2012-06-04 22:06:39
1. 在Eclipse里创建一个Java project(jni_test);
在src里创建一个package,取名为jni;
然后在jni里创建一个带有native声明的方法的java类(helloworld.java),文件具体内容如下:
package jni;
public class helloworld {
static{
System.loadLibrary("helloworld");
}
public native void dispHelloWorld();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//System.getProperty("java.library.path");
new helloworld().dispHelloWorld();
}
}
Eclipse工程树形图如下:
2.生成JNI头文件
在命令行里,cd到Java工程(jni_test)的src目录,例如:
cd E:\workspace\jni_test\src
然后执行javah -jni jni.helloworld(package不要漏掉)
生成的jni_helloworld.h文件如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class jni_helloworld */
#ifndef _Included_jni_helloworld
#define _Included_jni_helloworld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_helloworld
* Method: dispHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_helloworld_dispHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Eclipse工程树形图更新如下:
3. 在Java工程(jni_test)的src目录创建jni_helloworldImp.cpp,实现jni_HelloWorld.h中的函数,这里请注意函数名,cpp里的函数名跟h文件的函数名要一致。
jni_helloworldImp.cpp内容如下:
#include
#include "jni_helloworld.h"
#include
JNIEXPORT void JNICALL Java_jni_helloworld_dispHelloWorld
(JNIEnv *env, jobject obj)
{
printf("Hello world ! ");
return;
}
Eclipse工程树形图更新如下:
4. 在Java工程(jni_test)的src目录编译jni_HelloWorldImp.cpp产生dll,
在控制台下>cl
-LD jni_HelloWorldImp.cpp -Fehelloworld.dll,
以上命令的参数中,-LD表示产生dll,-Fe后面表示产生dll的名字,具体的参数可以自己用cl
-help命令查看,
如果成功编译,会产生helloworld.dll,
helloworld.lib, helloworld.exp,
以及jni_HelloWorldImp.obj四个文件。
Eclipse工程树形图更新如下:
这个过程中可能会遇到如下问题:
<1>. CL不是内部命令,解决方法:
在系统环境变量的path里加上VC-BIN路径,
C:\Program Files\Microsoft Visual Studio\VC98\Bin
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
<2>. fatal error C1083: Cannot open include file: 'jni.h': No such file or directory
解决方法:
拷贝%java_home%\include\jni.h
%java_home%\include\win32\jawt_md.h
%java_home%\include\win32\jni_md.h
到VC-INCLUDE目录(C:\Program Files\Microsoft Visual Studio\VC98\Include),
注:java_home指的是你的JDK目录。
将VC-INCLUDE目录添加到系统环境变量,新增一个INCLUDE变量,
变量值为:C:\Program Files\Microsoft Visual Studio\VC98\Include
<3>. LINK : fatal error LNK1104: cannot open file "LIBCMT.lib"
解决方法:
将VC-LIB目录添加到系统环境变量,新增一个LIB变量,
变量值为:C:\Program Files\Microsoft Visual Studio\VC98\Lib
5. 设置jni_test工程的lib路径,也就是将helloworld.dll的路径添加到工程的lib路径;
具体方法是:
右击项目名à选择属性propertiesà在左边列表内选择“Java Build Path”à在右边选项卡用选择“source”à点开项目名前的“+”号,选择“Native library location”,“Edit”选择路径。(当然如果将dll拷贝到workspace下也可以用相对路径。也可右击“src”设定其properties内Native Library项。)
6. 运行jni_test工程,run as java application,Console输出Hello world !
如图: