Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63301
  • 博文数量: 8
  • 博客积分: 207
  • 博客等级: 入伍新兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-24 13:42
文章分类
文章存档

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头文件

 在命令行里,cdJava工程(jni_test)src目录,例如:

 cd E:\workspace\jni_test\src

然后执行javah -jni jni.helloworldpackage不要漏掉)

生成的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”设定其propertiesNative Library项。)

 

6.       运行jni_test工程,run as java applicationConsole输出Hello world !

如图:

 

 

阅读(4095) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~