java——JNI(例子控制台(64位)清屏
因为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位)清屏的更多相关文章
- java jdk1.8 32/64位 官方绿色版下载附安装教程
java jdk1.8 32/64位 官方绿色版下载附安装教程 地址:https://www.jb51.net/softs/691593.html
- IDEA清空控制台以及Java中运行cmd命令实现清屏操作
IDEA中清空控制台方法 在网上有看到各种的实现方法,比如: Runtime.getRuntime().exec("cls"); 或者: public static void cl ...
- Java version 32转64位
本来在cmd中 输入 java -version后显示 为 32位,现在需要转为64 位因为eclipse 不兼容,方法: ()下载 java 1.8 64位,安装,然后 ()进入环境变量 发现有两个 ...
- java 开发工具包 jdk 64位 jdk-8u221-windows-x64.exe 迅雷下载
迅雷下载链接(迅雷新建任务,复制链接进去): https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324 ...
- JAVA判断32位还是64位,调用不同的DLL(转)
源:JAVA判断32位还是64位,调用不同的DLL 通过获取sun.arch.data.model可判断是32还是64的JAVA 将32或者64位的DLL放不同的目录,实现自适应调用DLL Prope ...
- 64位Eclipse运行时提示“Failed to load the JNI shared library \Java\jre6\bin\client\jvm.dll”的一个解决方案
系统安装的32位JREE,64位eclipse无法识别,解决方案:下载安装64位jdk即可.
- win7+64位+Java学习基本软件安装+环境配置+eclipse(IDE)
一.下载安装JDK 1.安装包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.h ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- 64位Ubuntu下的Eclipse、ADT终于可以生成R.java了,虚机也可以正常建立
64位Ubuntu12下的Eclipse总也不能自动生成R.java,导致无法正常编译程序,建虚拟器的时候总是提示少文件....三天下班机器没关(无奈公司网络不给力)来安装lib包. 各种加载,总结一 ...
随机推荐
- Ant快速入门(三)-----定义生成文件
适应Ant的关键就是编写生成文件,生成文件定义了该项目的各个生成任务(以target来表示,每个target表示一个生成任务),并定义生成任务之间的依赖关系. Ant生成文件的默认名为build.xm ...
- 在c++中使用Outlook Object Model发送邮件
一.Outlook Object Model简介 Outlook Object Model(OOM)是outlook为开发者提供的一个COM组件,我们可以在程序中使用它来发送邮件.管理邮箱等.相关介绍 ...
- 开发者应该避免使用的6个Java功能(转)
本文作者是一名拥有多年Java开发经验的程序员,他从经验中得出,并不是所有的Java SE功能/API都值得程序员去使用,比如本文列举的这6个,大家在使用前得慎重对待.以下是对原文的摘译. 多年的Ja ...
- sql server 2005中使用with实现递归
WITH fw_requestion_note_temp(old_apply_id) AS ( --取根节点放入临时表 SELECT old_apply_id FROM fw_requestion_n ...
- COJ 1008 WZJ的数据结构(八) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...
- BZOJ1754: [Usaco2005 qua]Bull Math
1754: [Usaco2005 qua]Bull Math Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 374 Solved: 227[Submit ...
- Linux下的memset函数
函数原型 void *memset(void *s, int c, size_t n); 函数功能 将以s为首的存储空间前n字节空间全部替换为参数c指定的数据. 返回值 更新后的首地址s. 头文件 # ...
- Linux项目一
Linux项目一 引言: 这是我去年做的东西,一直没有时间整理,今天又要做一个基于这个项目的客户端与服务器版本. 以前我写的库文件中的函数耦合度很大,在一个函数中调用另一个函数,导致一无法拆开使用! ...
- [Design Pattern] Filter Pattern 简单案例
Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式. 下面是一个过滤模式的简单案例. Criteria 定义过滤接口 ...
- Java RMI 入门案例
Java Remote Method Invocation(Java RMI) 是一个 Java API, 执行远程方法的调用,相当于 Remote Procedure Calls(RPC).Java ...