一 考题

二 native延伸

native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。但是,如果必须执行本地调用,则要考虑几个准则:

1.将您的所有本地方法都封装到一个类中,这个类调用单个的DLL。对每一种目标操作系统平台,都可以用特定于适当平台的版本的DLL。这样可以将本地代码的影响减少到最小,并有助于将以后所需要的移植问题考虑在内。

2.本地方法尽量简单。尽量使您的本地方法对第三方(包括Microsoft)运行时DLL的依赖减少到最小。使您的本地方法尽量独立,以将加载您的DLL和应用程序所需的开销减少到最小。如果需要运行时DLL,必须随应用程序一起提供。

JNI的书写步骤如下:

a.编写带有native声明的方法的Java类

b.使用javac命令编译编写的Java类

c.使用java -jni ****来生成后缀名为.h的头文件

d.使用其他语言(C、C++)实现本地方法

e.将本地方法编写的文件生成动态链接库

以下是一个在Java中调用本地C程序的简单的例子:

a.编写HelloWorld.java类

class HelloWorld{

public native void hello();

static{
             System.loadLibrary("hello");
          }

public static void main(String[] args){

new HelloWorld().hello();
         }

}

b.编译

javac HelloWorld.java

c.生成.h文件

javah -jni HelloWorld

生成内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */

#ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    hello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_hello
      (JNIEnv *, jobject);

#ifdef __cplusplus
    }
    #endif
    #endif

第一个参数是调用JNI方法时使用的JNI Environment指针。第二个参数是指向在此Java代码中实例化的Java对象HelloWorld的一个句柄。其他参数是方法本身的参数

d.c实现

#include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>
    JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
       printf("Hello World!\n");
       return;
    }

其中,第一行是将jni.h文件引入(在%JAVA_HOME%\include目录下),里边有JNIEnv和jobject的定义。

e.编译c实现

这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
  
  cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
  
  注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
  
  6) 运行程序
  
  java HelloWorld就ok了!

例子是照着别人的网页做的,其他还有很多东西,可以看资源连接。

资源:

IBM网站的一篇文章:http://www.ibm.com/developerworks/cn/java/jnimthds/

china itpub一篇文章:http://java.chinaitlab.com/JDK/36677.html

http://java.chinaitlab.com/JDK/36678.html

J2SE5的Java Native Interface Specification

http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html

java面试题二十八 从未用过的 native相关推荐

  1. C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。

    1. 题目 编写函数function,该函数的功能是:从字符中删除指定的字符,同一字母的大.小写按不同字符处理. 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科 ...

  2. Java设计模式之二十八(里氏代换原则)

    一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别.也就 ...

  3. Java小白学习二十八——冒泡排序

    冒泡排序 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置 每一次比较,都会产生一个最大,或者最小的数字 下一轮则可以少一次排序 依次循环,直到结束 package com. ...

  4. java面试题二十九 多线程数据共享问题

    1 编一个程序,实现2个线程对 j 变量自增, 2个线程对 j 变量自减 2 代码如下 public class TestThread {public static void main(String[ ...

  5. java面试题二十六 多线程考题

  6. java面试题二十五 构造函数

  7. java面试题二十四 继承题2

    对于选项C  int add(int i,int j){} ,前面没有加public ,private等修饰符,则默认为default,以下是private ,protected,public,def ...

  8. java面试题二十 try catch

  9. Java多线程学习二十八:原子类和 volatile 有什么异同?

    原子类和 volatile 有什么异同 案例说明 volatile 和原子类的异同 我们首先看一个案例.如图所示,我们有两个线程. 在图中左上角可以看出,有一个公共的 boolean flag 标记位 ...

最新文章

  1. c++如何把字符串转为变量名_如何优雅地计算多变量
  2. [转]奇文-闲话操作系统(1/4)
  3. 017_SpringBoot异常处理方式-自定义错误页面
  4. 2020-11-10(service入门)
  5. Python Django Cookie的设置和获取相关属性
  6. HDU1907 ZJU3113
  7. [html] HTML5的video在手机端如何实现进来页面时就自动播放?
  8. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
  9. 端口抢占处理杀死线程端口
  10. systemback慎用:安装后无法启动
  11. 华数java 知乎_纠结编程语言的选择?他们为什么都选择了Java?
  12. jsp 弹出窗口设置大全
  13. rhino5 犀牛5 插件gh grasshopper 100%深度汉化 中文版 汉化版GH下载
  14. 【算法竞赛入门经典(第二版)】_要点提取(第三章)
  15. EasyPoi 模板导出Excel (带图片) 以及一些踩坑记录
  16. selenium模拟点击爬取微博评论消息
  17. 参考答案+实验设计与分析(第6版) [Design and analysis of experiments] - 蒙哥马利(Montgomery D.C)
  18. 计算器计算经纬距离_经纬距离计算器下载_经纬距离计算器官方下载-太平洋下载中心...
  19. Karto跑下载的数据集
  20. html怎么去除左边的圆点,在Html的CSS中去除标签前面小黑点以及ul、LI部分属性方法...

热门文章

  1. PAT1049 数列的片段和 (20 分)
  2. 容器学习 之 管理Volumn(十七)
  3. C++ string 使用详解(含C++20新特性)
  4. ELK日志系统的写入优化
  5. 【最优解法】1054 求平均值 (20分)_31行代码AC
  6. 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
  7. 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
  8. map语法获取index_MySQL SQL语法优化——使用Explain查看执行计划
  9. 将函数当做参数 matlab,Matlab中如何将(自定义)函数作为参数传递给另一个函数...
  10. mysql数据库定点任务_MySQL数据库Event定时执行任务详解