博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA学习笔记 第二篇
阅读量:4354 次
发布时间:2019-06-07

本文共 1854 字,大约阅读时间需要 6 分钟。

 

Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展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中被访问了。
  JAVA本地方法适用的情况
  1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问
  2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的
  3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
  首先写好JAVA文件
  /*
  * Created on 2005-12-19 Author shaoqi
  */
  package com.hode.hodeframework.modelupdate;
  public class CheckFile
  {
  public native void displayHelloWorld();
  static
  {
  System.loadLibrary("test");
  }
  public static void main(String[] args) {
  new CheckFile().displayHelloWorld();
  }
  }
  然后根据写好的文件编译成CLASS文件
  然后在classes或bin之类的class根目录下执行javah -jni com.hode.hodeframework.modelupdate.CheckFile,
  就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件
  然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件
  #include "CheckFile.h"
  #include
  #include
  JNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj)
  {
  printf("Hello world!\n");
  return;
  }
  之后编译生成DLL文件如“test.dll”,名称与System.loadLibrary("test")中的名称一致
   vc的编译方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll

  最后在运行时加参数-Djava.library.path=[dll存放的路径

        一下是我的个人的一些理解

     那么  jdk  中那么多 那么多类中都有 native 方法,它们是如何加载的呢,这个时候我们去看一看jdk中的源代码 .我们先看看熟悉的System类的截图

以下是Object类的截图

下面是Class类的截图

可以看到,他们无一例外的都一个 registerNatives()静态方法,并且在静态构造函数中调用了 registernatives方法。但是令我奇怪的是 registerNatives竟然也是 Native的

那么,这些原生的 jdk中的对象是怎么时间 Native的呢?

 

 

作者:duanmengchao 发表于2012-2-29 13:52:29
阅读:7 评论:0

 

转载于:https://www.cnblogs.com/duanjie/archive/2012/02/29/2489166.html

你可能感兴趣的文章
给年轻程序员的几句话
查看>>
ionic如何uglify和minify你的js,css,image,png....
查看>>
[LeetCode]Minimum Depth of Binary Tree
查看>>
jboss初体验
查看>>
Python列表、元组练习
查看>>
angular页面刷新
查看>>
Leetcode:7- Reverse Integer
查看>>
C6表单(方成eform)---自定义流程标题格式
查看>>
GridView下DropDownList 的选择方法onselectedindexchanged 实现方法
查看>>
Python之set集合
查看>>
Generic Repository Pattern - Entity Framework, ASP.NET MVC and Unit Testing Triangle
查看>>
Win7 下新版本Windows Virtual PC 安装SharePoint步骤详解
查看>>
SQLSERVER 升级版本的方法
查看>>
atitit.web 推送实现方案集合
查看>>
VisualSVN和VisualSVN Server有区别,前者是客户端,后者是服务器端
查看>>
jquery1.8.3 callbacks源码分析
查看>>
Mac Anaconda 安装
查看>>
Vue2.0 新手入门 — 从环境搭建到发布
查看>>
带jdk15类似的jar配置
查看>>
redis基本操作
查看>>