- 浏览: 854688 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
目前 java 与 dll 交互的技术主要有 3 种: jni , jawin 和 jacob 。 Jni ( Java Native Interface )是 sun 提供的 java 与系统中的原生方法交互的技术(在 windows\linux 系统中,实现 java 与 native method 互调)。目前只能由 c/c++ 实现。后两个都是 sourceforge 上的开源项目,同时也都是基于 jni 技术的 windows 系统上的一个应用库。 Jacob ( Java-Com Bridge )提供了 java 程序调用 microsoft 的 com 对象中的方法的能力。而除了 com 对象外, jawin ( Java/Win32 integration project )还可以 win32-dll 动态链接库中的方法。就功能而言: jni >> jawin>jacob ,其大致的结构如下图:
jni 技术体系功能结构图
就易用性而言,正好相反: jacob>jawin>>jni 。
Jvm 封装了各种操作系统实际的差异性的同时,提供了 jni 技术,使得开发者可以通过 java 程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过 jni 提供的相应原生接口开调用 java 应用系统内部实现的功能。
在 windows 系统上,一般可执行的应用程序都是基于 native 的 PE 结构, windows 上的 jvm 也是基于 native 结构实现的。 Java 应用体系都是构建于 jvm 之上。
Windows 系统上的 java 体系
Jni 对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用 c/c++ 来实现一个代理程序( jni 程序)来实际操作目标原生函数, java 程序中则是 jvm 通过加载并调用此 jni 程序来间接地调用目标原生函数。
Jni 调用过程示意图
Jni 程序开发的一般操作步骤如下:
l 编写 java 中的调用类
l 用 javah 生成 c/c++ 原生函数的头文件
l c/c++ 中调用需要的其他函数功能,实现原生函数 ( 原则上可以调用任何资源 )
l 将项目依赖的所有原生库和资源加入到 java 项目的 java.library.path
l 生成 java 程序
l 发布 java 应用和 dll 库
Jni
程序开发示例:
1、
在
eclipse
项目中新建一个
TestHello.java
,输入以下内容:
public
class
TestHello {
static
{
System.loadLibrary
(
"TestHello"
);
}
public
static
native
void
hello(String msg);
public
static
void
main(String[] args) {
hello
(
"Hello,Kimm!"
);
}
}
编译生成
TestHello.
class
文件。
2、
在命令行下使用
javah TestHello
命令,生成
TestHello.h
头文件(就是
jni
代理
stub
的接口)。
3、
在
VC6
中新建一个项目
TestHello,
项目类型为
Win32 Dynamic-Link Library
。点击
OK
。
在弹出的窗口中选择
A simple DLL project
,点击
Finish
。
打开项目所在的文件目录,将步骤
2
中生成的
TestHello.h
文件复制到此目录。点击左边中间的
FileView
,切换到文件浏览模式。在
Header Files
上点击右键,选择
Add Files to Folder…
。
选择
TestHello.h
文件,点击
OK
。
打开
StdAfx.h
文件,再最后面添加:
#include <jni.h>
#include "TestHello.h"
打开
TestHello.cpp
文件,在最后面添加一段代码:
JNIEXPORT void JNICALL Java_TestHello_hello(JNIEnv * env, jclass obj, jstring jMsg)
{
const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);
MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );
env->ReleaseStringUTFChars( jMsg, strMsgPtr);
}
在 VC 的菜单上选择 Tools-Options… ,打开选项对话框。在 Directories 文件夹,添加上 jdk 所在文件夹下的 include 和 include\win32 文件夹。
点击 VC 上的菜单项 Build-Build All ,生成 TestHello.dll 。
4、 将 VC 项目 Debug 文件夹中的 TestHello.dll 复制到 TestHello.class 所在的文件夹下。
5、 在命令行下输入 java TestHello ,弹出 MessageBox 对话框。调用 win32 api 成功。
- TestHello.rar (3.1 MB)
- 下载次数: 7
发表评论
-
关于Bad version number in .class file的问题
2010-11-15 14:20 970关于Bad version number in .class ... -
一个获取文件crc32校验码的简洁的java类
2010-05-12 19:48 3246从jdk1.4开始,java核心包里已经提供对crc计算的支持 ... -
Windows下Apache与Tomcat的整合
2010-05-12 13:52 1042为了完成这个任务,在 ... -
SSL双向认证java实现
2010-05-09 11:35 1775本文通过模拟场景,介 ... -
java.util.ResourceBundle 使用详解
2010-04-28 19:39 834一、认识国际化资源文件 这个类提供软件国际化的捷 ... -
基于JAAS实现登录
2010-04-25 22:11 1240JAAS:Java Authentication and ... -
什么是JAAS,以及灵活的Java安全机制
2010-04-25 22:05 1844今天在论坛上看到JASS,不清楚是什么呢,网上找了一下,受益良 ... -
Java插件技术
2010-04-25 21:31 21041.Java插件技术 Java插件技术(Java Plu ... -
java RMI的例子(转)
2010-04-25 21:11 921参考别人的程序后写了个自己的RMI 程序RMI ,远程方法 ... -
Java安全通信、数字证书及应用实践(转)
2010-04-21 21:05 1652摘要 : 在本文 ... -
Eclips 内存溢出
2010-04-13 16:26 1017在Eclipse 根目录下找到eclipse .ini ... -
Eclipse 启动不起来异常:JVM terminated. Exit code=-1
2010-04-11 10:09 7426Eclipse 启动不起来,出现以下错误: ... -
Java程序员需要了解的几个开源协议介绍
2009-12-21 21:32 1091介绍几个比较常见的开 ... -
apache lucene介绍
2009-12-15 09:16 1917什么是lucene Apache Lucene是一个开放源程序 ... -
Java基础:Java中堆内存与栈内存分配浅析
2009-08-11 20:19 1319Java 把内存划分成两种:一种是栈内存,另一种是堆内存 ... -
对synchronized(this)的一些理解
2009-07-23 10:21 1149一、当两个并发线程访问同一个对象object中的这个synch ... -
Linux下JNI调用
2009-07-09 12:43 1434整个实现过程可以分为五步来完成: 1)写一个声明了nativ ... -
如何在Java中执行其它程序
2009-07-09 12:42 2279在编写Java程序时,有时 ... -
linux下jdk的安装与卸载
2009-07-06 10:46 2075下面是卸载步骤: 用ro ... -
java.util.Date和java.sql.Date的区别及应用
2009-06-21 14:35 1107java.util.Date 就是在除了SQL语句的情况下面使 ...
相关推荐
jni详解 JNI设计实践之路 JNI技术手册 Java_JNI_编程进阶 android_jni操作指南
AndroidJNI技术,最关键生成.h头文件的方法
JNI技术手册.pdf jni详解.pdf JNI完全手册.doc
一个简单android上的jni使用用例,通俗易懂!直接编译运行即可。
JNI完全技术手册,整合网上所有资料和详细用法
\android 应用\JNI 技术\android 应用\JNI 技术\android 应用\JNI 技术\android 应用\JNI 技术\android 应用\JNI 技术\android 应用\JNI 技术\android 应用\JNI 技术\android 应用\JNI 技术
JNI技术在嵌入式软件开发中应用学些笔记
在实践开发网格计算服务的过程中遇到了跨平台与服务运行效率的问题,在解决问题的过程中对Java的JNI技术进行了较深入的研究。对开发过程中使用JNI技术的重点和难点所作研究后的一个归纳和总结,并结合具体的开发实例...
[JAVA]使用JNI技术实现JAVA程序调用dll、[JAVA]使用JNI技术实现JAVA程序调用dll
很好的JNI资料,对于JAVA 和 C/C++ 混合编程很有帮助
三个Demo分别演示了Java调用C/C++;C/C++调用Java;JNI技术数据类型转换和访问相关的技术。希望对初学者有帮助。
Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55 1、实例一:在jni中调用标准c中自带的函数printf(): 57 2、实例二、调用c 语言用户定义的函数... 58 ...
JNI完全技术手册.pdf
很小的一个JNI调用实例,并且介绍一些JNI调用的一些常见问题的解决办法。
JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI...
android中AsyncTask和jni技术简单应用--附案例附代码