博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java——JNI(例子控制台(64位)清屏
阅读量:6900 次
发布时间:2019-06-27

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

因为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 
改为#include "jni.h" /* Header for class Cls */#ifndef _Included_Cls#define _Included_Cls#ifdef __cplusplusextern "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 
#include
//暂时不能理解这段代码的意思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和林清滢老师的文档

 

转载于:https://www.cnblogs.com/vhyc/p/5958841.html

你可能感兴趣的文章
CSAPP:cachelab(1)
查看>>
时间序列识别代码调试版本1
查看>>
Tomcat内存溢出解决办法
查看>>
Vue:v-model指令
查看>>
Software Engineering | Strategy pattern
查看>>
ios开发系列-准备工作
查看>>
Android Studio调试手机或者安装APK的时候出现install failed test only
查看>>
js闭包
查看>>
Xcode +SVN
查看>>
设置界面分析
查看>>
SQL中DateTime转换成Varchar样式
查看>>
java.util.AbstractList
查看>>
几个常见用于解决nginx负载均衡的session共享问题的办法
查看>>
setTimeOut、setInterval与clearInterval函数
查看>>
Appium原理及版本变化细节
查看>>
iphone ios 用xcode4.2开发 访问web service的功能
查看>>
Visual Studio 代码折叠快捷键(摘要)
查看>>
《2016ThoughtWorks技术雷达峰会----雷达新趋势》
查看>>
正则【备用】
查看>>
FeatureSelectors
查看>>