因为java的最底层是jvm,所以单纯的控制台java程序不能感知jvm再下面的操作系统的情况,

可以通过JNI(Java Native Interface)技术实现java后台调用C++/C的dll(Dynamic Linkable Library,动态链接库)文件。

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

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

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

写出java程序调用c++清屏函数的例子

1,编写带有native的java类

public class Cls {
// 声明本地方法
public native void clear();
static {
//加载动态链接库DLL
//要保证加载的ClsCpp.dll在你安装的jdk\jre\bin下目录
System.loadLibrary("ClsCpp");
}
}

2,在cmd环境下,使用javah命令,把Cls.class编译成Cls.h文件

生成的Cls.h文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h" //注意把此处原来的命令#include <jni.h> 改为#include "jni.h"
/* Header for class Cls */
#ifndef _Included_Cls
#define _Included_Cls
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Cls
* Method: clear
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Cls_clear
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

3、创建DLL库项目类型

(1)在VS2010环境下,创建一个名称为ClsCpp的C++ Win32项目。在向导的应用程序类型处选择DLL

将你机器安装的jdk目录中的include文件夹下的文件jni.h和win32文件夹中的jni_md.h拷贝到ClsCpp项目的根目录中,并添加到项目中。

在这里我的复制有问题,导致找不到文件,我是新创建了文件然后代码复制过去

新建源文件Cls.cpp

#include "jni.h"

#include "Cls.h"

#include <stdio.h>

#include <stdlib.h>//暂时不能理解这段代码的意思

JNIEXPORT void JNICALL Java_Cls_clear(JNIEnv *, jobject) {

       system("cls");  //在C++中能直接调用操作系统中的清屏命令

}

最后,他就会在debug里面生成dll文件

但是,这并不是我们要的,因为我们的机子都是差不多64了吧

我们要修改cls.cpp文件的属性

首先右键属性

把它改为64位,在解决方案文件夹会看到我们新创建的X64文件夹,我们顺着X64\Debug\就可以找到64位的DLL了

(4)得到ClsCpp.dll,然后把它复制到你机器安装的jdk\jre\bin文件夹下.

(5)只要添加了1中的Cls.java类, 就能使用Cls类中的本地方法clear()进行清屏(说明一下这个清屏函数只能在cmd中进行

    public static void main(String args[]){
final Cls clearScreen = new Cls();
System.out.println("Hello,world");
Scanner sc = new Scanner(System.in);
String temp = sc.nextLine();
clearScreen.clear();
}

参考:http://www.cnblogs.com/Alandre/p/4456719.html和林清滢老师的文档

java——JNI(例子控制台(64位)清屏的更多相关文章

  1. java jdk1.8 32/64位 官方绿色版下载附安装教程

    java jdk1.8 32/64位 官方绿色版下载附安装教程 地址:https://www.jb51.net/softs/691593.html

  2. IDEA清空控制台以及Java中运行cmd命令实现清屏操作

    IDEA中清空控制台方法 在网上有看到各种的实现方法,比如: Runtime.getRuntime().exec("cls"); 或者: public static void cl ...

  3. Java version 32转64位

    本来在cmd中 输入 java -version后显示 为 32位,现在需要转为64 位因为eclipse 不兼容,方法: ()下载 java 1.8 64位,安装,然后 ()进入环境变量 发现有两个 ...

  4. java 开发工具包 jdk 64位 jdk-8u221-windows-x64.exe 迅雷下载

    迅雷下载链接(迅雷新建任务,复制链接进去): https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324 ...

  5. JAVA判断32位还是64位,调用不同的DLL(转)

    源:JAVA判断32位还是64位,调用不同的DLL 通过获取sun.arch.data.model可判断是32还是64的JAVA 将32或者64位的DLL放不同的目录,实现自适应调用DLL Prope ...

  6. 64位Eclipse运行时提示“Failed to load the JNI shared library \Java\jre6\bin\client\jvm.dll”的一个解决方案

    系统安装的32位JREE,64位eclipse无法识别,解决方案:下载安装64位jdk即可.

  7. win7+64位+Java学习基本软件安装+环境配置+eclipse(IDE)

    一.下载安装JDK 1.安装包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.h ...

  8. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  9. 64位Ubuntu下的Eclipse、ADT终于可以生成R.java了,虚机也可以正常建立

    64位Ubuntu12下的Eclipse总也不能自动生成R.java,导致无法正常编译程序,建虚拟器的时候总是提示少文件....三天下班机器没关(无奈公司网络不给力)来安装lib包. 各种加载,总结一 ...

随机推荐

  1. python——BS解析器

  2. 【转】android去掉EditView的默认焦点问题

    原文网址:http://www.111cn.net/sj/android/54680.htm 做一个输入框时发现android中EditView的默认焦点了,这种问题如果是在输入框还好,但在搜索页面或 ...

  3. VirtualBox - 自动调整屏幕大小,显示分辨率

    在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕调整不太好,操作起来非常不方便,需要安装Vbox的增强功能.具体如下:1, 在  设备--> 安装增强功能这时会自动加载VBOXA ...

  4. Socket的协议地址属性

    首先列举所需要的头文件 #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #in ...

  5. [LeetCode] 30. Substring with Concatenation of All Words 解题思路 - Java

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  6. Hackerrank 2020 February 2014 解题报告

    Hackerrank 2020 February 2014 解题报告 比赛链接 Sherlock and Watson (20分) 题意:给定一个数组,向右平移K次,然后有Q个询问,问第x位置上是几 ...

  7. 黑魔法__attribute__((cleanup))

    原文地址:http://blog.sunnyxx.com/2014/09/15/objc-attribute-cleanup/ 编译器属性__attribute__用于向编译器描述特殊的标识.检查或优 ...

  8. linux下为用户添加sudo命令功能

    为用户添加sudo命令功能: 打开etc下的sudoers文件 vi /etc/sudoers 在 root   ALL=(ALL)  ALL 下面添加如下一行,然后保存关闭 hadoop  ALL= ...

  9. Linux查看端口信息命令

    netstat -tlnp|grep 端口 eg: netstat -tlnp|grep 9889

  10. 【转】Android:Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...