JAVA开发 分析JNI标准原理,附实例
2011-12-21 08:01
274 查看
JNI已成为JAVA平台的一部分,它允许JAVA代码和其他语言写的代码进行交互。
JNI是JAVA Native Interface的缩写,中文为JAVA本地调用。
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:
调用C++函数实例:
环境说明:Win XP系统
1. 在MyEclipse 下新建JniTest项目,然后新建HelloWorld.java和TestDll.java 类
HelloWorld.java源码:
public class HelloWorld {
public native void displayHelloWorld(); //java 本地方法申明
static{
System.loadLibrary("HelloWorld"); //装入(加载)动态链接库,"HelloWorld"是要装入的动态链接库名称
}
}
TestDll.java源码:
public class TestDll {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
2. 编译JAVA类得到CLASS 文件
3. 生成C/C++头文件:
在windows中代开一个命令窗口,进入jnitest工程所在目录下的bin目录(其实就是找到生成的HelloWorld.class所在的目录),键入 javah -jni HelloWorld 后在当前目录生成 头文件HelloWorld.h。内容如下
HelloWorld.h 源码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_wudi_jni_HelloWorld */
#ifndef _Included_com_wudi_jni_HelloWorld
#define _Included_com_wudi_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_wudi_jni_HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4. 本地方法实现
在VS2010中新建C++的Win32 动态链接库项目,项目名HelloWorld 。将上述生成的HelloWorld.h拷贝到HelloWorld目录下面;将JDK安装目录下
include目录中的文件都拷贝到VS安装目录下的VC98\Include目录下面。
在VS中新建HelloWorld.cpp文件,实现头文件中生命的方法并编译生成DLL。
HelloWorld.cpp源码:
#include "stdafx.h"
#include<jni.h>
#include "HelloWorld.h"
#include<stdio.h>
JNIEXPORT void JNICALL Java_com_wudi_jni_HelloWorld_displayHelloWorld
(JNIEnv *env,jobject obj)
{
printf("From jni_helloWorldImpl.cpp:");
printf("Hello world!This is a JNI invoke demo. \n");
return;
}
5. 运行测试程序
先将生成的DLL拷贝到jnitest工程的bin下面,然后设置DLL搜索路径(环境变量PATH)为当前bin目录(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可;或者将dll拷贝到system32系统目录下也可以)。刷新项目,运行测试程序,将看到控制台输出:
From jni_helloWorldImpl.cpp:Hello world!This is a JNI invoke demo.
JNI是JAVA Native Interface的缩写,中文为JAVA本地调用。
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:
调用C++函数实例:
环境说明:Win XP系统
1. 在MyEclipse 下新建JniTest项目,然后新建HelloWorld.java和TestDll.java 类
HelloWorld.java源码:
public class HelloWorld {
public native void displayHelloWorld(); //java 本地方法申明
static{
System.loadLibrary("HelloWorld"); //装入(加载)动态链接库,"HelloWorld"是要装入的动态链接库名称
}
}
TestDll.java源码:
public class TestDll {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
2. 编译JAVA类得到CLASS 文件
3. 生成C/C++头文件:
在windows中代开一个命令窗口,进入jnitest工程所在目录下的bin目录(其实就是找到生成的HelloWorld.class所在的目录),键入 javah -jni HelloWorld 后在当前目录生成 头文件HelloWorld.h。内容如下
HelloWorld.h 源码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_wudi_jni_HelloWorld */
#ifndef _Included_com_wudi_jni_HelloWorld
#define _Included_com_wudi_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_wudi_jni_HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4. 本地方法实现
在VS2010中新建C++的Win32 动态链接库项目,项目名HelloWorld 。将上述生成的HelloWorld.h拷贝到HelloWorld目录下面;将JDK安装目录下
include目录中的文件都拷贝到VS安装目录下的VC98\Include目录下面。
在VS中新建HelloWorld.cpp文件,实现头文件中生命的方法并编译生成DLL。
HelloWorld.cpp源码:
#include "stdafx.h"
#include<jni.h>
#include "HelloWorld.h"
#include<stdio.h>
JNIEXPORT void JNICALL Java_com_wudi_jni_HelloWorld_displayHelloWorld
(JNIEnv *env,jobject obj)
{
printf("From jni_helloWorldImpl.cpp:");
printf("Hello world!This is a JNI invoke demo. \n");
return;
}
5. 运行测试程序
先将生成的DLL拷贝到jnitest工程的bin下面,然后设置DLL搜索路径(环境变量PATH)为当前bin目录(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可;或者将dll拷贝到system32系统目录下也可以)。刷新项目,运行测试程序,将看到控制台输出:
From jni_helloWorldImpl.cpp:Hello world!This is a JNI invoke demo.
相关文章推荐
- 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
- PyQt4 精彩实例分析* 实例4 使用标准输入框
- RPC原理及RPC实例分析
- Oracle execute plan 原理分析与实例分享
- StrongName原理分析及实例
- SAPUI5拓展标准应用的Controller原理分析及应用实践
- JNI技术实践小结--原理分析和详细步骤截图说明
- RPC原理及RPC实例分析
- [Android实例] Scroll原理-附ScrollView源码分析
- Java native方法、JNI实例及常见错误分析
- linux设备驱动模型之 kset原理与实例分析
- Android Touch事件原理加实例分析
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
- json原理分析及实例介绍
- 计算机操作系统原理--Linux实例分析
- RxJava实例及原理分析,以及RXJAVA2
- JAVA基础之理解JNI原理(java方式实现dll实例)
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- Camera图像处理原理及实例分析-重要图像概念
- Camera图像处理原理及实例分析-重要图像概念