java面试题二十八 从未用过的 native
一 考题
二 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相关推荐
- C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。
1. 题目 编写函数function,该函数的功能是:从字符中删除指定的字符,同一字母的大.小写按不同字符处理. 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科 ...
- Java设计模式之二十八(里氏代换原则)
一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别.也就 ...
- Java小白学习二十八——冒泡排序
冒泡排序 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置 每一次比较,都会产生一个最大,或者最小的数字 下一轮则可以少一次排序 依次循环,直到结束 package com. ...
- java面试题二十九 多线程数据共享问题
1 编一个程序,实现2个线程对 j 变量自增, 2个线程对 j 变量自减 2 代码如下 public class TestThread {public static void main(String[ ...
- java面试题二十六 多线程考题
- java面试题二十五 构造函数
- java面试题二十四 继承题2
对于选项C int add(int i,int j){} ,前面没有加public ,private等修饰符,则默认为default,以下是private ,protected,public,def ...
- java面试题二十 try catch
- Java多线程学习二十八:原子类和 volatile 有什么异同?
原子类和 volatile 有什么异同 案例说明 volatile 和原子类的异同 我们首先看一个案例.如图所示,我们有两个线程. 在图中左上角可以看出,有一个公共的 boolean flag 标记位 ...
最新文章
- c++如何把字符串转为变量名_如何优雅地计算多变量
- [转]奇文-闲话操作系统(1/4)
- 017_SpringBoot异常处理方式-自定义错误页面
- 2020-11-10(service入门)
- Python Django Cookie的设置和获取相关属性
- HDU1907 ZJU3113
- [html] HTML5的video在手机端如何实现进来页面时就自动播放?
- ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
- 端口抢占处理杀死线程端口
- systemback慎用:安装后无法启动
- 华数java 知乎_纠结编程语言的选择?他们为什么都选择了Java?
- jsp 弹出窗口设置大全
- rhino5 犀牛5 插件gh grasshopper 100%深度汉化 中文版 汉化版GH下载
- 【算法竞赛入门经典(第二版)】_要点提取(第三章)
- EasyPoi 模板导出Excel (带图片) 以及一些踩坑记录
- selenium模拟点击爬取微博评论消息
- 参考答案+实验设计与分析(第6版) [Design and analysis of experiments] - 蒙哥马利(Montgomery D.C)
- 计算器计算经纬距离_经纬距离计算器下载_经纬距离计算器官方下载-太平洋下载中心...
- Karto跑下载的数据集
- html怎么去除左边的圆点,在Html的CSS中去除标签前面小黑点以及ul、LI部分属性方法...
热门文章
- PAT1049 数列的片段和 (20 分)
- 容器学习 之 管理Volumn(十七)
- C++ string 使用详解(含C++20新特性)
- ELK日志系统的写入优化
- 【最优解法】1054 求平均值 (20分)_31行代码AC
- 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
- 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
- map语法获取index_MySQL SQL语法优化——使用Explain查看执行计划
- 将函数当做参数 matlab,Matlab中如何将(自定义)函数作为参数传递给另一个函数...
- mysql数据库定点任务_MySQL数据库Event定时执行任务详解