您的位置:首页 > 编程语言 > Java开发

JNI入门学习笔记

2009-08-31 20:49 218 查看
JNI的全称是Java Native Interface,我们可以使用JNI来编写用C语言实现的Native方法,然后生成动态链接库来让Java程序调用。

 

下面来举一个简单的例子供大家参考学习。

 

首先你要配好Java和VC的环境变量,把Java和VC的Bin目录的路径放在path中。接下去你可以跟着下面步骤开始。

 

1. 编写Java程序HelloJNI.java

 

public class HelloJNI {
   public native void printHelloJNI();     // 声明native 方法
 
   static {
      System.loadLibrary("hello");
   } 
 
   public static void main(String[] args) {
      new HelloJNI().printHelloJNI();
   } 
}

 

2. 编译HelloJNI.java

 

命令:javac HelloJNI.java

 

生成HelloJNI.class

 

3. 生成扩展名为.h的C的头文件

 

命令:javah HelloJNI

 

生成HelloJNI.h文件,该文件内容如下

 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    printHelloJNI
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printHelloJNI
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4. 实现JNICALL Java_HelloJNI_printHelloJNI(JNIEnv *, jobject)方法,编写HelloJNIImpl.c

 

#include <jni.h>
#include "HelloJNI.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJNI_printHelloJNI(JNIEnv *env, jobject obj)
{
    printf("Hello JNI!/n");
    return;
}

 

5. 生成动态链接库,使用VC的编译器cl命令

 

命令:cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloJNIImpl.c -Fehello.dll

这时可能会有如下的错误:

 

Command line warning D4024 : unrecognized source file type 'Files/Java/jdk1.5.0_
14/include', object file assumed
Command line warning D4024 : unrecognized source file type 'Files/Java/jdk1.5.0_
14/include/win32', object file assumed
HelloJNIImpl.c
HelloJNIImpl.c(1) : fatal error C1083: Cannot open include file: 'jni.h': No suc
h file or directory

 

该错误的原因是你的%java_home%的路径中有空格,比如你的Java可能在Program Files下,解决方法是给路径加上引号

 

修改后的命令:cl -I"%java_home%/include" -I"%java_home%/include/win32" -LD HelloJNIImpl.c -Fehello.dll

 

这时可能会有如下的错误:

fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory

 

该错误的原因是编译器不知道stdio.h文件在哪,解决的办法有两种,一种是引入该文件,方法是在-I"%java_home%/include/win32"后面加上-I和stdio.h的路径;另一种是启动VCVARS32.BAT,启动它可以创建VC的编译环境,该BAT在VC98文件下的Bin文件夹下。为了避免出现类似找不到或打不开文件的错误,我们使用启动VCVARS32.BAT来创建VC的编译环境,此后Include和Lib文件夹下的文件就都可以使用了。

 

启动VCVARS32.BAT的方法是使用命令:VCVARS32

 

再使用命令:cl -I"%java_home%/include" -I"%java_home%/include/win32" -LD HelloJNIImpl.c -Fehello.dll

 

这时就会生成HelloJNIImpl.obj文件,hello.dll文件和hello.exp文件,我们比较需要的是hello.dll文件

 

6. 运行HelloJNI.class

 

命令:java HelloJNI

 

如果输出是"Hello JNI!"就成功了。

 

7. 总结。可能出现的问题是会在输入命令后出现找不到文件或打不开文件的错误,这时就要排查路径是否正确,路径是否存在,路径中有没有空格(加引号解决),或者有没有创建了VC的编译环境。

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息