JAVA和C/C++的区别有很多,你知道Java程序需要链接吗?
Java 语言与C/C++ 在语法上很相似,但是由于它是伴随着互连网络成长起来的,为了迎合异构主机构架以及支持安全的软件分发,逐步发展成为一个语言平台。
我们知道如果用C/C++写程序,从源代码到可执行程序需要经历编译,链接两个步骤。但是用Java语言写程序则不同,你只需要将你的源代码编译成字节码
就可以了,字节代码通过Java虚机来运行。要概括上面两种语言的这一不同之处,我们可以说Java是通过Java解释来执行的,C/C++是通过编译来
执行的。
如果你用C/C++来写一个通讯程序完成Intel/Windows
到Sparcs/Solarise两台计算机之间的通讯功能,你需要经历痛苦编译和链接。也许你会使用标准C编译器,使用其提供的最基本的C语言API,
再加上若干的#if...#define
写出一个在上面两个计算机都可以编译链接成功的源程序,这意味着所有标准C语言API之上的工作都要由你一个人来完成。也许你会在标准的C语言API上使
用C++来封装一个精巧的类库,或者使用别人的类库来屏蔽底层OS API的不同,并在这样类库之上写出一个漂亮的源程序。
可见使用C/C++要完成上面的工作可不容易,你除了要为你写的源文件和不同的编译器的语法规则做斗争,将我们的源程序编译成为中间件文件;同时还需要为
你所使用第三方的类库文件与链接程序做斗争如果你源程序和第三方库不是采用一个编译器编译出来的,哪你还得找到第三方类库的源代码,或者是换一个编译器来
编译你的源程序。基本上要经历好几轮的修改、编译、链接,才能让的源程序进入运行状态。
如果你采用Java来写这个程序则轻松了很多。你可以使用JDK所提供的API,也可以使用第三方的Java类库。你的源程序可以很轻松的编译成为字节
码,这些只是一个一个的程序块,如果想让程序运行起来,需要Java虚机在运行时动态加载(RunTime
Link)其所需要的资源,使之成为一个可以运行的程序。Java语言这样做的好处显而易见,首先源程序只需要编译一次,成为独立与具体机器指令的中间文
件,然后这些字节码就可以在任意的标准的Java虚机上运行。
说了这些众所周知的C/C++与Java语言在编译运行的不同,对我们有什么启发呢?笔者先后做过C/C++和Java的开发,开始并没有领会其中的真
谛,直到前几个月深入接触到了class loader才真正体会到Java这一RunTime Link
的神奇魅力,可以让我们完成很多静态链接所无法完成的任务。
如果我们拿到了一个C/C++编译完成的可执行程序,如果这个时候你想为这个可执行程序添加一些可以扩展的功能,如果你这时没有源代码,那你等待你的可能
是处理复杂的汇编指令,或者采用钩子函数去替换可执行程序调用的API。如果你拿到的是JAVA程序,你可以像修改C/C++可执行程序一样修改Java
的目标文件字节码的方式来实现,但是我们可以通过一种更优美的方式来修改或者扩这Java程序的运行时的特性。
因为Java是解释执行的,其目标文件字节码是一个非常小的,并且是很容易理解的指令集合。Java虚机为了能够让这些短小的指令集合能够运行起来,这就
是我们前面提到的C/C++程序链接(Link)所做的事情(链接就是要把程序运行所需要API以及相关的资源文件,都重新进行组织生成可以单独运行的程
序)。由于Java程序是运行在Java虚机之上的,自然的Java程序在运行过程中所需要加载的类文件或其他的资源文件都需要Java虚机来负责加载,
并提供管理和调用。写过Java程序的朋友也许经常会遇到这样一个问题吧,就是Exception in thread "main"
java.lang.NoClassDefFoundError:XXX,一般遇到这个问题的时候,基本上都是因为你的CLASSPATH没有设置正确,
设置正确的CLASSPATH,就可以解决这个问题,但是有多少人会去深究其中的奥秘呢?
首先我们来究其原因,我们知道Java虚机在运行的过程中是通过class
loader动态读取Class文件,并将加载后Class的字节码交付给Java虚机执行。这个很容易理解,Java虚机不可能预先知道任意一个
Java程序需要的Class文件,所以Java虚机需要通过某种手段来实现Class文件的正常读写,上面的Exception就是Java虚机在加载
Class文件出现的。
知道这一原理之后,我们如果想在不修改源程序的基础上扩展Java第三方程序库的功能,或者说我们想改变某个Class文件的指令结构。这样我们就很容易
得实现让第三方程序实现一个特定的接口,或者是暴露给我一个原来只能内部调用的方法。我们可以通过调用一些第三方的程序库(BCEL,ASM等)来实现对
应字节码的修改,通过class loader实现将修改后的字节码提交给JVM,然后链接执行。
See, It is simple and easy.
在下面的几篇文章里,我们将详细看到几个如果通过处理Java字节码,来实现对第三方程序库修改的例子。
未完待续
分享到:
相关推荐
哈工大LTP java在Eclipse上编译所需要用到的动态链接库,(.lib和.dll、.exp)64位系统可用
哈工大LTP java在Eclipse上编译所需要用到的动态链接库,(.lib和.dll、.exp)64位系统可用
在java执行过程中我们将其划分为5个部分:评价、决议、加载、验证和编译,并伴随着与他们相关的检查。我们论证了如何联合这5个部分来确保类型的稳定。我们采用一个抽象的观点和基于我们的模型的一种比字节码更接近...
哈工大LTP java在Eclipse上编译所需要用到的动态链接库,(.lib和.dll、.exp)64位系统可用
java程序中加载动态链接库文件方法,涉及到C语言实现控制底层硬件的方法
java调用动态链接库例程(测试通过)及库包 jna4.3 完整资源,demo。 jna 4.3 、示例 dll ,调用demo
1.java调用动态链接库实例 2.包含so库的生成实例 3.java调用so的实例
动态链接库和静态链接库区别,让你真正理解动态链接库和静态链接库的区别。
java调用动态链接库
Java调用动态链接库 Java 调用 DLL 源码
动态链接库的唯一功能就是使用Java 能够理解的C 代码来调用目标原生函数。 这个没什么实际用途的动态链接库的编写过程令人沮丧。同时编写Java 和C 代码使开 发难度大大增加。 因此,在Java 开发社区中,人们一直都视...
然后再在 Java 中载进这个适配器 dll/so ,再编写 Java?? native 函数作为 dll 中函数的代理。 经过 2 个繁琐的步骤才能在 Java 中调用本地代码。 因此,很少有 Java 程序员愿意编写调用 dll/.so 库中的原生函数的 ...
java调用C语言动态链接库
如何创建c++动态链接库,供其它语言调用如(java,c++)
海康威视 综合安防管理平台8700 java调用C++接口,提供录像下载相关功能! maven项目,Eclipse导入注意!
用java调用C或C++动态链接库原来如此简单 java调用dll
经过网上查找的资料和实践,可以在java界面中点击按钮调用C的程序将结果显示到java的文本框中,里面有代码和步骤,祝你成功~~
java调用动态链接库1.doc
NULL 博文链接:https://zheng12tian.iteye.com/blog/1488813
JNative是目前比较简单的一个Java调用动态链接库jar包,使用简单,容易掌握,大家共同学习。