JVM怎样让native method跑起来
2016-03-19 20:15
288 查看
参考:http://blog.csdn.net/jiakw_1981/article/details/3073613
JVM怎样使Native Method跑起来:
我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。
最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。
可以将native方法比作Java程序同C程序的接口,其实现步骤:
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
具体实现方法可以从网上查找,这里就不写了
不过,又引出两个东西:javah.exe命令和JNI
自己写了一个调用VB的DLL的例子,不过还没写完,调用函数部分不会写,只写了加载DLL的过程
JAVA部分:
JVM怎样使Native Method跑起来:
我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。
最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。
可以将native方法比作Java程序同C程序的接口,其实现步骤:
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
具体实现方法可以从网上查找,这里就不写了
不过,又引出两个东西:javah.exe命令和JNI
自己写了一个调用VB的DLL的例子,不过还没写完,调用函数部分不会写,只写了加载DLL的过程
JAVA部分:
public class TestNativeMothod { public static void main(String[] args) { //PROCESS LOGIC } public native String callNativeMothod(); static { System.loadLibrary("TestNativeMethodProj"); } }VB部分:
Option Explicit Public Function callNativeMothod() As String callNativeMothod = "This is a method implemented by VB" End Function
相关文章推荐
- Jenkins进阶系列之——13修改Jenkins权限控制
- 构建之法阅读笔记03
- 第三周进度条
- 四则运算2
- 第四周上机实践项目——项目3-随机数函数应用于游戏
- 第4周-项目4-(1)
- 1005-前缀判断
- GitHub设置无密码登录
- Jenkins进阶系列之——11修改Jenkins用户的密码
- Jenkins进阶系列之——12详解Jenkins节点配置
- latex: IEEEtran.bst 参考文献的标题最后的逗号放在反引号的后面
- 第11条:理解objc_msgSend的作用
- 【杭电oj】1280 - 前m大的数(水)
- Android5.0之Toobar的使用
- Android5.0之Toobar的使用
- Linux的userdel和deluser命令
- Jenkins进阶系列之——10Publish Over SSH插件
- Android5.0之Toobar的使用
- 小知识点7
- Android5.0之Toobar的使用