精华内容
下载资源
问答
  • Java调用dll的几种方法

    千次阅读 2017-08-23 08:27:35
    Java调用dll的几种方法Java_JNI调用C/C++代码JNI,是Java Native Interface的简称,中文是“Java本地调用”。通过这种技术可以做到以下两点: Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++...

    Java_JNI调用C/C++代码

    JNI,是Java Native Interface的简称,中文是“Java本地调用”。通过这种技术可以做到以下两点:

    • Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
    • Native程序中的函数可以调用Java层的函数,也就是说在C/C++程序中可以调用Java的函数。

    JNI并不是什么特别神奇的东西,当初SUN推出它的目的是为了屏蔽不同操作系统平台的差异性,通过Java语言来调用Native语言的功能模块,避免重复制作车轮,最主要是这两个目的。
    主要步骤如下:

    • 首先在Java类中声明一个native的方法
    • 使用Javah命令生成native方法的声明的C/C++头文件
    • 按照生成的C/C++头文件来编写C/C++源文件
    • 将C/C++源文件编译成动态链接库(DLL)
    • 将DLL文件加入到PATH环境变量下

    在eclipse中创建一个Java项目

    这里写图片描述

    创建了一个命为:JNI的项目,新建包名为bingcao,新建类为TestJNI
    接着在TestJNI类当中声明我们的本地方法:

    package bingcao;
    
    /**
     * @author troy
     *         2017-08-22  下午19:28
     *
     */
    public class TestJNI {
        // 声明本地方法
        public native double nativeMethod();
    
        public static void main(String[] args) {
    
            /*long startTime = System.currentTimeMillis(); // 获取开始时间
            // // 加载动态链接库
            System.load("D:/documents/visual studio 2013/Projects/nativeDLL/x64/Debug/nativeDLL.dll");
    
            TestJNI nativeCode = new TestJNI();
            double result = nativeCode.nativeMethod();
            System.out.println(result);
            System.out.println("JNI成功调用dll!!!");
    
            long endTime = System.currentTimeMillis(); // 获取结束时间
    
            System.out.println("程序运行时间: " + (endTime - startTime) + "ms");*/
        }
    }
    
    

    /* ……*/ 内注释掉的代码后面很快会用到,暂时不用管。

    用jdk中javah命令来为我们生成对应的头文件,在命令可以敲入javah -help:

    这里写图片描述

    格式为:javah 包名.文件名

    成功运行后,在当前路径下生成的.h文件:
    这里写图片描述

    javah命令生成native头文件。编辑器打开头文件,有以下代码:

    接着在Visual studio中创建一个win32控制台应用程序,取名为nativeDLL

    最后在Eclipse中使用Java调用我们的Native代码:

    package bingcao;
    
    /**
     * @author troy
     *         2017-08-22  下午19:28
     *
     */
    public class TestJNI {
        // 声明本地方法
        public native double nativeMethod();
    
        public static void main(String[] args) {
    
            long startTime = System.currentTimeMillis(); // 获取开始时间
            // // 加载动态链接库
            System.load("D:/documents/visual studio 2013/Projects/nativeDLL/x64/Debug/nativeDLL.dll");
    
            TestJNI nativeCode = new TestJNI();
            double result = nativeCode.nativeMethod();
            System.out.println(result);
            System.out.println("JNI成功调用dll!!!");
    
            long endTime = System.currentTimeMillis(); // 获取结束时间
    
            System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
        }
    }
    

    运行,调用成功
    这里写图片描述

    Java_JNA调用DLL

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。

    你只需要下载一个jar包,就可以使用JNA的强大功能方便地调用动态链接库中的C函数。

    1,下载jna.jar: jna.jar的下载地址

    2,在Java项目中引入jna.jar包;

    这里写图片描述

    3,创建一个类;

    package bingcao;
    
    import com.sun.jna.*;
    
    /**
     * @author troy
     *         2017-08-22  下午19:28
     *
     */
    public class TestJNA {
    
        public interface nativeDLL extends Library {
    
            ///当前路径是在项目下,而不是bin输出目录下。
            nativeDLL INSTANCE = (nativeDLL) Native
                    .loadLibrary(
                            "D:/documents/visual studio 2013/Projects/nativeDLL/x64/Debug/nativeDLL",
                            nativeDLL.class);
    
            public double Java_bingcao_TestJNI_nativeMethod();
        }
    
        public static void main(String[] args) {
    
            // TODO Auto-generated method stub
            long startTime = System.currentTimeMillis(); // 获取开始时间
            double result = nativeDLL.INSTANCE.Java_bingcao_TestJNI_nativeMethod();
            System.out.println(result);
            System.out.println("JNA成功调用dll!!!");
            long endTime = System.currentTimeMillis(); // 获取结束时间
            System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
    
        }
    
    }
    

    4,加载上面生成的DLL,运行结果如下:

    这里写图片描述

    展开全文
  • java调用python的几种方法整理

    千次阅读 2018-01-08 10:35:37
    一、在java类中直接执行python语句 import org.python.util.PythonInterpreter; public class FirstJavaScript { public static void main(String args[]) { PythonInterpreter interpreter = new ...

    一、在java类中直接执行python语句

    import org.python.util.PythonInterpreter;
    public class FirstJavaScript {
        public static void main(String args[]) {
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
            interpreter.exec("print days[1];");
        }// main
    }

    调用的结果是Tue,在控制台显示出来,这是直接进行调用的。

    二、在java中调用本机python脚本中的函数

    import org.python.core.PyFunction;
    import org.python.core.PyInteger;
    import org.python.core.PyObject;
    import org.python.util.PythonInterpreter;
    
    public class FirstJavaScript {
        public static void main(String args[]) {
    
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.execfile("C:\\Python27\\programs\\my_utils.py");
            PyFunction func = (PyFunction) interpreter.get("adder",
                    PyFunction.class);
    
            int a = 2010, b = 2;
            PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
            System.out.println("anwser = " + pyobj.toString());
        }// main
    }

    得到的结果是:anwser = 2012

    三、使用java直接执行python脚本

    import org.python.util.PythonInterpreter;
    
    public class FirstJavaScript {
        public static void main(String args[]) {
    
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.execfile("C:\\Python27\\programs\\input.py");
        }// main
    }

    四:如若python文件中有引入第三方库如numpy,sklearn,pandas等,可以通过java调用进程的方式

    基本思路:通过java调用cmd,传入Python 命令,然后传入参数,通过获取到Python文件中的print,获取返回值

    使用方式,将数据txt文件路径通过参数形式,传给Python且运行读取数据,最后java获取python的print的数据。

    public static void main(String args[]){
    		try{
    			System.out.println("start");
    	                String[] pythonData =new String[]{"python 运行的命令","py文件路径","测试传参数据文件路径"};
    			//读取到python文件
    			Process pr = Runtime.getRuntime().exec(pythonData);
    			InputStreamReader ir = new InputStreamReader(pr.getInputStream());
    			LineNumberReader in = new LineNumberReader(ir);
    			String line ;
    			//获取到python中的所有print 数据,
    			while((line=in.readLine()) != null){
    				System.out.println("python print data"+line);
    			}
    			ir.close();
    			in.close();
    			pr.waitFor();
    			System.out.println("end");
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}

    内容来源于网络

    展开全文
  • Java运行Python脚本的几种方式

    千次阅读 2017-12-21 22:28:24
    有时候在java项目里,需要执行Python脚本,故总结以下几种方式: 1、直接执行Python脚本代码 引用 org.python包 PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("days=('mod','...

    有时候在java项目里,需要执行Python脚本,故总结以下几种方式:

    1、直接执行Python脚本代码
    引用 org.python包

    PythonInterpreter interpreter = new PythonInterpreter();  
    interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");   ///执行python脚本

    2 、执行python .py文件

    PythonInterpreter interpreter = new PythonInterpreter();  
    InputStream filepy = new FileInputStream("D:\\demo.py"); 
    interpreter.execfile(filepy);  ///执行python py文件
    filepy.close();

    3、使用Runtime.getRuntime()执行脚本文件

    这种方式和.net下面调用cmd执行命令的方式类似。如果执行的python脚本有引用第三方包的,建议使用此种方式。使用上面两种方式会报错java ImportError: No module named arcpy。

    Process proc = Runtime.getRuntime().exec("python  D:\\demo.py");  
    proc.waitFor();  
    展开全文
  • java实现动态编译的几种方法

    万次阅读 2018-09-19 09:05:00
    所谓动态编译,就是在程序运行时产生java类,并编译成class文件。    在D盘test目录下有两个java文件:AlTest1.java、AlTest2.java,现需要通过java代码实现java文件到class文件的编译操作: import java.io....

    所谓动态编译,就是在程序运行时产生java类,并编译成class文件。

     

     在D盘test目录下有两个java文件:AlTest1.java、AlTest2.java,现需要通过java代码实现java文件到class文件的编译操作:

    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.piao.main.ApplicationAdmin;
    
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ComponentScan("com.piao")
    @SpringBootTest(classes = ApplicationAdmin.class)
    public class Compiler {
    	
    	@Test
    	public void compiler1(){
    		String javaAbsolutePath = "D:/test/AlTest1.java";
    		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    		compiler.run(null, null, null, "-encoding", "UTF-8", "-classpath", javaAbsolutePath.toString(), javaAbsolutePath);
    	}
    	@Test
    	public void compiler2(){
    		String javaAbsolutePath = "D:/test/AlTest2.java";
    		
    		try {
    			Process process = Runtime.getRuntime().exec("javac -classpath D:/test/ " + javaAbsolutePath);
    			InputStream errorStream = process.getErrorStream();
    			InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
    			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    			String line = null;
    			while ((line=bufferedReader.readLine()) != null){
    				System.out.println(line);
    			}
    			int exitVal = process.waitFor();
    			System.out.println("Process exitValue: " + exitVal);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}	
    	}
    	
    	 
    }
    

     运行后, D:\test 目录会生成两个class文件

     

    其中方法compiler1是使用jdk自带的rt.jar中的javax.tools包提供的编译器

    方法compiler2是使用Runtime执行javac命令

     

     

     

     

     

     

     

     

     

     

     

     

    参考资料:

    https://www.cnblogs.com/anai/p/4269858.html

    展开全文
  • System的静态方法in返回的是一个InputStream类型的对象,则我们可以用读取输入流的方式对其进行读取。 按API的说法“此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入...
  • java的四种输入方法,你会几种

    千次阅读 多人点赞 2020-10-07 18:30:07
    java的输入方法最常见的就是Scanner的方法,我经过查阅一些资料发现了输入方法原来还有那么多种,可以玩出不少花样,下面是我总结出的四输入方式,有需要的可以拿去 1.Scanner相关的功能 Scanner的输入方法是最...
  • Java之——运行Python脚本的几种方式

    万次阅读 2016-03-17 15:36:45
    1、直接执行Python脚本代码 ...使用上面两方式会报错java ImportError: No module named arcpy。 Process proc = Runtime.getRuntime().exec("python D:\\execute_command.py"); proc.waitFor();
  • 而接下来准备讲的java.lang.NoClassDefFoundError和ClassNotFoundException,就是属于让人咬牙切齿的问题之二。这两个问题乍一看好像都是指找不到某个类了,虽然出现这两问题的部分原因相同,但事实上,这两个错误...
  • Java制作jar包的几种方法

    千次阅读 2014-10-25 14:02:45
    一、操作零散的单个或个class文件 [plain] view plaincopyprint? jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class  二、把一个文件夹下面的所有...
  • 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。 一.线程的生命周期及五基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识...
  • 在网络编程中,有时我们需要判断两台机器之间的连通性... URL 的网络资源读取,基于 TCP/IP 层的 Socket 编程,以及一些辅助的类库),但是没有直接提供类似 Ping 命令来测试网络连通性的方法。本文将介绍如何通过 Java
  • java命令执行的三方式

    千次阅读 2020-03-12 16:21:01
    本篇文章总结一下java命令执行的三方式,并且测试了在win环境一次方法调用中可同时执行多个命令的方式。 1 java.lang.Runtime public class RuntimeTest { public static void test1() throws IOException{ ...
  • java 进程间通讯的有几种方法

    万次阅读 热门讨论 2014-09-12 12:44:01
    进程间通信的方法主要有以下几种:  (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。  (2)命名管道(named pipe):命名管道克服了管道没有...
  • java多线程的几种状态

    万次阅读 2018-09-04 13:00:38
    Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用...2. Runnable:运行状态,Java线程把操作系统中的就绪和运行状态统一称为“运行中” 3. Blocked:阻塞,线程进入等待状态,...
  • Jetty和Tomcat运行Maven Web项目几种方法

    千次阅读 2014-10-22 19:15:53
    上一篇我们介绍了用Eclipse创建了Maven Web项目,接下来我们介绍怎么运行Maven Web项目方便我们开发和调试,这里使用的是Maven插件的形式引用进来的,这样耦合性比较低,我们需要什么样的工具就引入对应的插件就可以...
  • Java中main方法传参的几种方式

    万次阅读 2017-08-24 16:31:19
    一般情况下 我们的main方法是不需要参数传入的 但是如果在工作中需要我们写一些小的应用程序 并且以jar包的方式发给其他人员直接在dos界面使用并且需要输入参数的时候就需要用到main的参数传递。 ...
  • 在Linux系统下运行.sh文件有两种方法,比如我在root/zpy目录下有个zpy.sh文件 第一种(这种办法需要用chmod使得文件具备执行条件(x): chmod u+x zpy.sh): 1、在任何路径下,输入该文件的绝对路径/root/zpy/zpy....
  • http://www.programfan.com/article/2720.html将Java应用程序本地编译为EXE的几种方法(推荐使用JOVE和JET) 1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件 编译成EXE文件。 2. 利用微软...
  • 今天找了半天的毛病 关于java的一个写入记事本的小程序 封装成jar包后 因为我的机器上有运行环境 所以双击 就能在jar包的所在位置执行 并且生成了一个记事本 但是在控制台里用java -jar 执行的时候 就没有生成记事本...
  • Java启动命令大观

    万次阅读 多人点赞 2013-12-15 22:03:02
    Java启动命令是所有java应用程序的入口,通过它来启动Java运行时环境,并加载相关的class。不过由于IDE的盛行,我们Java程序员中的大多数的并不是非常的了解Java启动命令。本文希望做一个Java启动命令的汇总,和各位...
  • Java几种常用设计模式

    万次阅读 多人点赞 2018-08-09 16:50:32
    Java 中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、...
  • Java应用程序本地编译为EXE的几种方法: 1.exe4j exe4j可以打包成各种格式的exe,可以把jar打包进exe,也可以引用一个外部的jar文件,还可以打包成windows服务的程序,并且可以设置最低jre的版本,还可以设定启动...
  • Java启动命令大观

    千次阅读 2017-07-01 16:04:09
    Java启动命令是所有java应用程序的入口,通过它来启动Java运行时环境,并加载相关的class。不过由于IDE的盛行,我们Java程序员中的大多数并不是非常的了解Java启动命令。本文希望做一个Java启动命令的汇总,和各位...
  • Java jstack 命令详解

    千次阅读 2018-07-07 19:41:48
    Java 中 jstack 命令可以用来查看运行Java 进程下,多线程的运行情况,我们用一个死锁的例子来看: 比如下面这段死锁的代码: public class DeadLock { private static Object objA = new Object(); ...
  • 本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有价值的参考。 前言 任务调度是指基于给定...
  • Eclipse是最有名也最广泛使用的Java集成开发环境(IDE),允许开发者结合语言支持和其他功能到任何的默认包中,而且Eclipse市场有许多定制和扩展的插件。 IntelliJ已经引起了开发者的“追捧”,甚至比Eclipse还...
  • cmd中可以运行java,但不能运行javac命令

    万次阅读 多人点赞 2017-10-19 21:27:21
    在cmd中可以运行java,但运行javac命令时提示:'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。 原因:安装java时把jdk的路径和jre的路径选择成一样,就造成覆盖了。这时候你在lib下也找不到tools....
  • OutOfMemoryError: Java heap space:堆内存不够用,无法分配更多内存,就会抛出这个异常。 OutOfMemoryError: unable to create native thread:这个在创建太多的线程,超过系统配置的极限。如Linux默认允许单个...
  • 找出Java进程ID pid的N种方法

    万次阅读 2017-02-27 20:28:00
    拿到进程ID pid能做些什么呢?暴力的杀掉它,比如:...使用 jinfo:可以输出并修改运行时的java 进程的opts(选项,项目项)。如:jinfo 56860Attaching to process ID 56860, please wait...Debugger attached success

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 251,389
精华内容 100,555
关键字:

java运行命令行几种方法

java 订阅