云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 利用JNI实现Java与C - 通信 - 向模军

利用JNI实现Java与C - 通信 - 向模军

  • 62 次阅读
  • 3 次下载
  • 2025/6/15 0:42:52

利用JNI实现Java与C++通信

向模军

(四川机电职业技术学院信息工程系,四川 攀枝花 617000)

摘 要:在分析JNI技术框架的基础上,通过实例展示了一种如何实现Java与C++之间通信的方法。实践证明,该方法 具有较高的实用价值。

关键词:JNI;Java;C++;编程接口

Using JNI to Establish Communication between Java and C++ XIANG Mo-jun

(Dept. of Information & Engineering, Sichuan Electromechanical Institute of Vocation and Technology, Panzhihua, Sichuan 617000, China)

Abstract:On the basis of analyzing the technical framework of JNI, a method how to establish communication between Java and

C++ is demonstrated through examples. The practice has proved that the method has a higher practical value.

Key words:JNI;Java;C++;programming interface 0 引言

Java语言的功能很强大,但不是万能的。如Java丢弃了指 针这一功能强大且与低层硬件有关的语言设施,导致不能直接 访问硬件。事实上,与C++相比Java执行效率低,对于一些计 算量大的算法,Java就不是最好的选择。那么如何实现Java与 C++协同合作呢?Java的缔造者们在开发之初就已考虑到了这 一点,在 Java 中提供了与 C++的编程接口,这就是 JNI(Java Native Interface,Java本地接口)。

通常至少有以下几种情况需要使用JNI来实现。

⑴ 为了实现Java语言所不能实现的功能:如所开发的应

用程序要使用到与平台相关的属性,而Java标准类库不支持对 这些属性的处理;

⑵ 为了获取更好的程序运行性能:程序的某个模块对速

度要求比较苛刻,从而希望用较低级的语言来实现,同时希望 在Java应用程序中使用这个模块;

⑶ 为了保护历史投资:已经拥有了用其他编程语言实现 的类库或应用程序,希望用Java直接调用他们。 1 JNI技术框架

JNI最大的好处是它没有对Java虚拟机的实现施加任何限

制,JNI技术框架没有更改Java语言的任何属性,只是给Java语 言提供了一种对外的调用方式,是对Java编程技术的一个扩 充。应用JNI技术开发的应用技术框架如图1所示。 C Side Functions Libraries Java Side Classes VM

Exceptions JNI

Application

图1 应用JNI技术开发的应用技术框架

从图1不难看出,JNI是一种包容极广的编程接口。JNI允 许我们从Java应用程序里调用本地化方法。也就是说,JNI允 许运行在虚拟机上的Java程序能够与其他语言(多数情况是 C++语言)编写的应用程序或者类库进行相互间的调用。同时 JNI也提供了一整套的应用程序编程接口,允许将Java虚拟机 直接嵌人到本地的应用程序中。

在JNI技术中,由于是两种语言环境的信息交换,所以存在 着数据类型对应的问题,这也是JNI技术实现不同语言之间相 3 结束语

本成绩管理系统能自动计算总分、自动确定名次;具有数 据输入防错功能;对于不及格数据自动用明显的红色显示,无 用零值自动不显示。在安全性方面,从外到内层层保护,进入 工作簿要检验密码,工作簿结构、工作表都使用密码保护,工作 表中除用户的基本数据输入区外,其它区域都进行锁定或隐藏 保护,保证公式、引用等不被破坏。另外,利用本系统能方便地 转储与再加工成绩数据。如把某些数据复制出来,选择性贴到 新的工作表中,便可做想要的处理;学期成绩登记表可单独复 制出来,供任课老师登记成绩,或供班主任进行学生成绩分 析。本系统可用于初中、高中及大中专院校的成绩管理。 参考文献:

[1] 李天启.Visual Basic 6.0 学习捷径(中文版)[M].清华大学出版社, 1999.

[2] 杰诚文化.EXCEL2007 财务管理范例应用[M].中国青年出版社, 2008.

互通信的基础。JNI处理基本数据类型和引用数据类型的方法 不尽相同。对基本数据类型的映射是直接的,如Java语言中的 int被映射C++中的jint。具体映射关系如表l所示。 表1 Java类型与本地类型对照 Java类型 boolean byte

char short int long float double void

本地类型 jboolean jbyte jchar jshort jint jlong jfloat jdouble void

物理存储 unsigned,8bit signed,8bit unsigned,16bit signed,16bit signed,32bit signed,64bit 32bit 64bit n/a

2 实现样本及其分析

在Java环境下调用C++语言代码的过程通常由六个步骤 组成,如图2所示。

创建带有本地方法的Java源程序(*.java) 编译生成类文件(*.class)

利用javah生成对应的头文件(*.h) 创建C++端代码(*.c/*.cpp)

编译本地方法并生成动态链接库(*.dll) 调用Java类并运行程序 图2 JNI的实现流程 2.1 创建Java源程序 public class JNIJ { public double x=2.5; public double y=0.0;

//声明本地方法,该方法用 C++代码实现。 public native void TestJNI();

public static void main(String[] args) {

//加载由 C++实现的库文件 JNIC.dll。 System.loadLibrary(\JNIJ t=new JNIJ(); t.TestJNI();

System.out.println(t.y); } }

2.2 编译Java程序

在win32平台上,利用JDK提供的javac工具,在java源文 件目录下,运行:javac JNIJ.java,则在同一目录下会生成一个 JNIJ.class文件。 2.3 生成头文件

利用 JDK 提供的 javah 工具,生成 C++语言所需的头文

件。在所生成的.class文件目录下运行:javah JNIJ,则在同一目 录下会生成一个JNIJ.h文件。

头文件完成的工作:引用 JNI定义文件jni.h;定义与C++ 兼容的结构;声明本地方法的C++语言函数原型。 JNIJ.h头文件里有一代码行:

JNIEXPORT void JNICALL Java_JNIJ_TestJNI(JNIEnv *, jobject); 即是java文件中本地方法的本地实现函数的声明部分。函数

原型的名称由前缀“Java_”加上“类名_本地方法名”构成。两个 参数是JNI技术规范中要求的:第一个参数是JNIEnv接口的一 个指针,通过这个指针才能将Java应用中要访问的参数或对象 传递给C++语言端的应用;第二个参数是当前对象本身的引 用,可以想象它就是Java应用中的this变量。

建议将头文件的“#include ”改为“#include“jni.h””。 2.4 创建C++源程序

#include \包含头文件

JNIEXPORT void JNICALL Java_JNIJ_TestJNI (JNIEnv *env, jobject obj) {

jclass class_T=env->GetObjectClass(obj); //获取对象类

jfieldID idx=env->GetFieldID(class_T,\获取数据域标志 jfieldID idy=env->GetFieldID(class_T,\

jdouble x=env->GetDoubleField(obj,idx); //获取 x 值 env->SetDoubleField(obj,idy,x*x); //设置 y 的值为 x*x }

2.5 生成动态链接库

首先建议将%Java_Home%\\include的jni.h和%Java_Home% \\include\\win32的 jni_md.h复制到C++源文件目录。当然可以 使用 VC++编译生成动态链接库,也可以使用命令:cl /LD JNIC.cpp,生成同名的JNIC.dll。生成的动态库名务必要与在原 Java代码所载入的库名一致。 2.6 运行Java程序

至此,Java与C++之间相互通信的过程基本完成了。利用

命令:java-cp.JNIJ将得到输出结果。在上面的程序中,Java将 x的值传给C++,C++经过运算x*x,回传给Java的y,在Java中 输出y的值为6.25。 3 结束语

采用JNI技术来集成遗留下来的应用系统是个很好的解决

方案。JNI 作为 Java 与 C++之间的一个桥梁,能有效地实现 Java代码与C++库函数中本地代码之间的交互,给系统的实现 带来极大的灵活性。通过JNI,我们可以很好地把两种高级语言 整合在一起,实现各自的优势。 参考文献:

[1] 林胜利,王坤茹,孟海利.Java优化编程[M].电子工业出版社,2005. [2] 苏德富,陈志琦,霍林.基于JNI的Java与其他高级语言之间通信的研 究与应用[J].广西大学学报(自然科学版),2005.30(1).

[3] 任俊伟,林东岱.JNI技术实现跨平台开发的研究[J].计算机应用研究, 2005.22(7).

[4] 张华平,玄光哲,于贵平等.基于JNI技术应用框架的分析和实现[J]. 吉林大学学报(信息科学版),2003.21(2).

搜索更多关于: 利用JNI实现Java与C - 通信 - 向模军 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

利用JNI实现Java与C++通信 向模军 (四川机电职业技术学院信息工程系,四川 攀枝花 617000) 摘 要:在分析JNI技术框架的基础上,通过实例展示了一种如何实现Java与C++之间通信的方法。实践证明,该方法 具有较高的实用价值。 关键词:JNI;Java;C++;编程接口 Using JNI to Establish Communication between Java and C++ XIANG Mo-jun (Dept. of Information & Engineering, Sichuan Electromechanical Institute of Vocation and Technology, Panzhihua, Sichuan 617000, Chin

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com