JAVA开发 分析JNI标准原理,附实例
来源:互联网 发布:兼职网络写手怎么赚钱 编辑:程序博客网 时间:2024/04/29 18:22
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.
- JAVA开发 分析JNI标准原理,附实例
- JAVA JNI开发应用实例
- [Android实例] Scroll原理-附ScrollView源码分析
- [Android实例] Scroll原理-附ScrollView源码分析
- JNI开发之访问java的实例
- Java对象赋值原理详解(上)附实例源码
- Java对象赋值原理详解(下)附实例源码
- JNI开发之JNI原理
- JNI实例以及分析
- Android JNI原理分析
- Android JNI原理分析
- Android JNI原理分析
- Android JNI原理分析
- 【Android应用开发】-(14)JNI----经典实例分析
- 前端开发BFC原理实例分析
- JNI开发实例
- JAVA JNI 使用实例
- JAVA JNI 使用实例
- 仿新浪网“返回顶部”效果
- 跟随鼠标的图片效果
- 天天iPad 2011/12/21
- myeclipse改变工作区间workspace
- 继续聊WPF——用Blend自定义Listview控件的列表头
- JAVA开发 分析JNI标准原理,附实例
- 注册邮箱验证激活账号
- contentprovider的学习实例总结
- MyContentProviderActivity.java
- 分形艺术作品第十四辑渲染日志
- MyDataBase.java
- MyProvider.java
- Utils.java
- VBA中Option的四种用法