zoukankan      html  css  js  c++  java
  • 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在你安装的jdkjrein下目录
            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文件夹,我们顺着X64Debug就可以找到64位的DLL了

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

      (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和林清滢老师的文档

  • 相关阅读:
    HDU 5059 Help him
    HDU 5058 So easy
    HDU 5056 Boring count
    HDU 5055 Bob and math problem
    HDU 5054 Alice and Bob
    HDU 5019 Revenge of GCD
    HDU 5018 Revenge of Fibonacci
    HDU 1556 Color the ball
    CodeForces 702D Road to Post Office
    CodeForces 702C Cellular Network
  • 原文地址:https://www.cnblogs.com/vhyc/p/5958841.html
Copyright © 2011-2022 走看看