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

  • 相关阅读:
    文本溢出
    不需要原稿,直接在jpg文件中修改文字
    Photoshop的常用技巧
    canvas拼接背景图和qrcode生成的二维码,实现二维码分享功能。
    OC从文件或者URL获取字符串,以及写入文件
    OC学习将C语言字符串转换为OC字符串
    OC字符串NSString常用操作系列01
    三目运算符-----IOS开发学习记录第10天之C语言学习
    逗号表达式-----IOS开发学习记录第6天之C语言学习
    IOS开发学习记录第5天之C语言学习
  • 原文地址:https://www.cnblogs.com/vhyc/p/5958841.html
Copyright © 2011-2022 走看看