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的编译环境。
下面来举一个简单的例子供大家参考学习。
首先你要配好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的编译环境。
相关文章推荐
- jni入门学习笔记(一)
- JNI入门学习笔记(测试环境:ubuntu gcc 4.4.5)
- jni入门学习笔记(一)
- JNI 入门学习笔记(一)
- jni入门学习笔记(一)
- Go圣经-学习笔记入门bufio
- 初学者入门学习java的简介笔记(1)
- perl入门学习笔记
- swift3.0 入门学习笔记之一 基础篇
- 学习UnityShader入门精要笔记1——渲染流程概述
- 5.3.vue入门基础学习笔记-基础指令介绍(属性绑定v-bind)
- [Spring入门学习笔记][Spring的AOP原理]
- hadoop的学习笔记(入门版)(应试版)(hadoop实战精华)和一点hadoop相关资料
- dubbo入门学习笔记
- unity3D-游戏/AR/VR在线就业班 C#入门二维数组学习笔记
- 每天成长一点---WEB前端学习入门笔记
- 东软学习,hibernate初级学习的部分截图和笔记(一)-入门以及XMl基础配置
- [TensorFlow]入门学习笔记(5)-循环神经网络RNN
- 1. 笔记JAVA框架学习——Spring入门环境搭建及helloworld