精华内容
下载资源
问答
  • Java程序调用自定义c语言程序 计算机中有很多的编程语言,各有各的特色和应用范围。Java混合编程就是Java程序和其它应用程序进行通讯和数据交互,比如我们都知道c语言的计算性能要比Java的略好一些,所以Java程序...

    Java程序调用自定义c语言程序

    计算机中有很多的编程语言,各有各的特色和应用范围。Java混合编程就是Java程序和其它应用程序进行通讯和数据交互,比如我们都知道c语言的计算性能要比Java的略好一些,所以Java程序可以调用c语言程序来进行一些比较耗时的计算工作,从而提高程序性能。

    # JNI编程

    例子:调用c语言方法实现两个整数相加,返回相加的结果

    步骤:

    • 定义类JNITest和方法sum(int, int)
    • 调用javac.exe编译,得到JNITest.class
    • 调用javah.exe(javah.exe也是jdk自带的)得到包含该方法(Java_ipso_JNITest_sum())的头文件JNITest.h
    • 实现.c文件(对应JNITest.h)
    • 将.c和.h文件,整合为共享库(DLL)文件
    • 在Java类中,加载响应的共享库文件

    具体实现

    
    /* -------------------  这是Java程序  -------------------*/
    
    package ipso.JNI;
    
    public class JNITest {
        public static native int sum(int num1, int num2);
    
        public static void main(String[] args) {
            System.loadLibrary("JNITest");   // dll名字
            JNITest test = new JNITest();
            int sum = test.sum(3, 4);
            System.out.println("使用c语言求得两数和为:" + sum);
        }
    }
    
    // 使用cmd工具并cd到项目目录下,使用命令javah -cp [字节码目录(不包括包名)] [包名+class名] 得到如下文件
    
    /* -------------------  这是javah -cp [字节码文件目录] [字节码文件名] 命令生成的C语言头文件  -------------------*/
    
    // 经过上一步操作得到如下ipso_JNI_JNITest.h C语言头文件
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class ipso_JNI_JNITest */
    
    #ifndef _Included_ipso_JNI_JNITest
    #define _Included_ipso_JNI_JNITest
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     ipso_JNI_JNITest
     * Method:    sum
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_ipso_JNI_JNITest_sum
      (JNIEnv *, jclass, jint, jint);   // 将这里复制到.c C语言文件中并实现该方法的逻辑体
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    /* -------------------  这是引入javah命令生成的C语言头文件的C语言文件,在这里实现两个整数相加的计算  -------------------*/
    
    // 编写ipso_JNI_JNITest.c文件用来实现程序逻辑如下:
    // 这是ipso_JNI_JNITest.c文件
    ##include "ipso_JNI_JNITest_sum.h"
    JNIEXPORT jint JNICALL Java_ipso_JNI_JNITest_sum(JNIEnv *env, jobject obj, jint num1, jint num2){
        return num1 + num2;
    }
    
    void main(){}
    
    // 将上面的.c文件使用gcc编译成共享文件库.dll(windows上)文件或者.so(Linux上)文件, 注意共享文件库的32/64位要于JDK的32/64位相匹配
    // gcc编译成dll文件的命令可以搜索,除了gcc也可以用其它的c语言编译工具编译成共享文件库文件。
    // 到这里JNITest类中的sum方法就可以享普通Java方法一样使用了。
    
    

    # 最后

    以上的例子可以将业务逻辑部分扩展一下从而实现更复杂的逻辑功能。每个语言都有自己的特色和应用范围,程序开发中可以根据业务逻辑调用不同的程序语言来实现不同的业务逻辑,从而达到取长补短的效果。Java也提供了其它语言的调用方式,比如说脚本语言js可以使用ScriptEngine来实现调用js程序或者其它脚本程序,这里不再细说,感兴趣的读者可以自行查询文档。喜欢的点个赞,给作者更多鼓励。

    展开全文
  • Java程序调用C/C++语言函数的方法导语:Java提供了完备的C/C++语言接口,这样我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。 下面就由小编为大家介绍一下Java程序调用C/...

    Java程序调用C/C++语言函数的方法

    导语:Java提供了完备的C/C++语言接口,这样我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。 下面就由小编为大家介绍一下Java程序调用C/C++语言函数的方法,欢迎大家阅读!

    一、创建DLL文件

    使用某一种C/C++开发工具创建Dll文件,实现某一功能,供JAVA调用,例如本文在此使用Visual studio 2005创建一个名为testdll的动态库文件。

    二、使用JNI

    JNI是Java Native Interface的缩写,中文为JAVA本地调用。它允许Java代码和其他语言写的代码进行交互。

    1.JAVA类

    在JAVA程序中,首先需要在类中声明所调用的库名称,如下:

    static {

    System.loadLibrary(“testdll”); //加载动态库,testdll为DLL文件名称

    }

    还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:

    public native static void set(int i);

    public native static int get();

    然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。

    例如程序testdll.java,内容为:

    public class testdll { static { System.loadLibrary(“testdll”); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); test.set(10); System.out.println(test.get()); } }

    用javac testdll.java编译它,会生成testdll.class。

    再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

    2.C/C++

    创建C/C++项目需要增加的头文件有jni.h、jni_md.h这两个文件是JNI中必须的;还有就是增加testdll.h。

    对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

    接上例子。我们先看一下testdll.h文件的内容:

    #include #ifndef _Included_testdll #define _Included_testdll #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint); #ifdef __cplusplus } #endif #endif

    在具体实现的时候,我们只关心两个函数原型 JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);和 JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的.int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

    下面我们用testdll.cpp文件具体实现这两个函数:#include "testdll.h" int i = 0; JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass) { return i; } JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j) { i = j+5; }

    编译连接成库文件,这里就是testdll.dll。把testdll.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。

    三、总结

    使用JNI可以在JAVA中调用其它语言编写的代码,在一定程度上消除JAVA的局限性和低效率。

    【Java程序调用C/C++语言函数的方法】相关文章:

    展开全文
  • JAVA调用C语言程序

    千次阅读 2020-08-27 13:42:00
    JAVA调用C语言程序JAVA调用C语言程序1. 编写带有native声明的方法的Java类2. 使用javah 生成:jniSample.h的头文件3. 使用C实现本地sum方法:(这里我生成文件...C调用JAVA程序(基于反射的方法) JAVA调用C语言程序 J

    JNI:

    java Native INterface:JAVA原生数据库
    java与C互操作
    C调用JAVA程序(基于反射的方法)

    JAVA调用C语言程序

    JNI实现native方法

    本次操作在Mac上,使用eclipse编写java,使用xcode运行c代码,xcode中可以使用gcc。
    课程是MOOC上JAVA相关课程
    (这里的compile.cmd文件可不关心,我用来存放,第四部步骤的相关命令的)
    在这里插入图片描述

    1. 编写带有native声明的方法的Java类

     use javah -cp bin jniSample we can get jniSample.h file.
    public class jniSample {
       //要在C中实现的方法sum。
    	public native int sum(int a, int b);
    	
    	public static void main(String[] args) {
    		//加载共享库文件libjniSample.jnilib文件。
    		System.loadLibrary("jniSample");
    		
    		jniSample sample = new jniSample();
    		int Sum = sample.sum(5, 6);
    		
    		System.out.println(Sum);
    	}
    }
    

    2. 使用javah 生成:jniSample.h的头文件

    use javah -cp bin jniSample we can get jniSample.h file.
    在终端,先切换到项目文件夹下:
    执行:

    javah -cp bin jniSample
    

    刷新项目:在eclipse中,右键项目,refresh即可。得到jniSample,该文件无需更改。

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class jniSample */
    
    #ifndef _Included_jniSample
    #define _Included_jniSample
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     jniSample
     * Method:    sum
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_jniSample_sum
      (JNIEnv *, jobject, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。

    #include "jinSample.h"
    JNIEXPORT jint JNICALL Java_jniSample_sum
      (JNIEnv *env, jobject obj, jint num1, jint num2){
         return num1*num2;
      }
    
    void main(){}
    

    4. 将本地方法编写的文件生成动态链接库。

    mac下使用gcc生成动态链接库文件
    使用: 查看jdk路径

    /usr/libexec/java_home -V
    

    再将自己的jdk路径改下,以下是我的jdk路径。

    gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/ jinSample.c -o libjniSample.jnilib
    

    提示错误:

    /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/jni.h:45:10: fatal error: 
          'jni_md.h' file not found
    

    使用下列命令copy一份。在运行上述代码。

    sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include
    

    5. 再次刷新项目,再使用jniSample.java文件运行代码,得到结果。

    30
    

    注意:
    这里java文件中加载jniSample.jnilib文件。写的是"jniSample"。但是第四步骤中,写的是:libjniSample.jnilib。该名称前加上:lib。不如运行java代码调用本地sum方法时会报错。

    展开全文
  • java调用C语言代码

    2021-03-16 01:12:18
    欢迎来到:...linux下内置了编译器gcc,我们要做的只是写好c源文件然后在进行编译就可以了,但是如果没有gcc编译器的话,使用以下命令获取~# sudo apt-get install gcc同时要下载辅助工具~# s...

    欢迎来到:http://observer.blog.51cto.com

    第一步:搭建C语言开发环境了。

    在此,个人使用的linux系统,介绍的linux的安装,windows的朋友可自行上网搜索。

    linux下内置了编译器gcc,我们要做的只是写好c源文件然后在进行编译就可以了,但是如果没有gcc编译器的话,使用以下命令获取

    ~# sudo apt-get install gcc

    同时要下载辅助工具

    ~# sudo apt-get install binutils

    头文件库

    ~# sudo apt-get install Llibc6-dev

    好了,C语言开发环境已经搭建完毕。

    第二步:写好并编译c源文件

    在此个人给一点小建议:C文件的编写与编译放在java开发项目底进行下,编译完成之后不要再移动编译文件,否则会出现各种各样的问题,比如我这里,一旦移动就必须给编译文件hello.exe在属性中赋予运行权限。比如以下的consider便为我的java项目名。

    在此再给一点小提醒:C文件尽量在哪台机器上使用就在哪台机器上编译,因为不同的机器使用的可能是不同类的处理器和操作系统,如果是另外一台机器编译出来的,放到自己的机器上编译可能就会出现点问题。比如:一般不能先在自己的计算机上编译此程序,再把编译好的内容上载到 Web 服务器。因为自己的计算机可能是widows,而服务器一般为linux。

    在此以编写文件:hello.c为例子:

    #include

    #include

    #include

    int main()

    {

    char buf[1024];

    while(1){

    gets(buf);//标准输入流,输入字符串

    printf("list: %s\n", buf);//标准输入流,将字符串输入

    fflush(stdout); //fflush()用于对输出缓冲区进行刷新。

    }

    }

    写好之后在控制台进入该文件目录,比如:

    ~# cd /home/roadahead/workspace/consider

    接下来编译C源文件:

    ~# gcc hello.c -o hello.exe(hello.c是C源文件,hello.exe为编译后得到的运行文件)

    测试文件是否可用:

    ~# $ ./hello.exe

    hello

    list: hello

    nihao

    list: nihao

    ^C

    出现以上现象证明已经可以使用。

    第三步:编写并运行java

    在此使用eclipse编译工具,项目名:consider,文件名:CHelloWrod.java,上代码:

    //:CHelloWrod.java

    import java.io.BufferedInputStream;

    import java.io.BufferedOutputStream;

    import java.io.DataInputStream;

    import java.io.File;

    import java.io.IOException;

    import java.io.PrintStream;

    public class CHelloWrod {

    final static int BUFFER_SIZE = 1024;

    public byte[] resultBuf = new byte[BUFFER_SIZE];

    public Process helloP;

    public PrintStream nameList;

    public DataInputStream addResult;

    public CHelloWrod(){

    String CPath = new File("").getAbsolutePath()+"/hello.exe";

    //获取当前项目的路径,hello.exe放在项目根目录下,不管liunx还是widows都适用

    System.out.println(CPath);

    try {

    helloP = Runtime.getRuntime().exec(CPath);

    //为启动 C 程序,需要取得当前的 Runtime 对象。我们用它调用exec(),再由后者返回 Process 对象。

    nameList = new PrintStream(new BufferedOutputStream(

    helloP.getOutputStream()));

    //获取C中的标准输入流,封装到java中

    addResult = new DataInputStream(new BufferedInputStream(

    helloP.getInputStream()));

    //获取C中的标准输出流,封装到java中

    } catch (IOException e) {

    System.err.println("Cannot start listmgr.exe");

    System.exit(1);

    }

    int byteCount;

    for(int i=0; i<10; i++){

    try {

    System.out.println("I output hello"+i);

    nameList.println("hello"+i);

    //向C的标准输入流中输入字符串

    nameList.flush();

    byteCount = addResult.read(resultBuf);

    //从C的标准输出流中得到反馈,存储于resultBuf中

    String result = new String(resultBuf,0,byteCount).trim();

    System.out.println(result);

    } catch (IOException e) {

    System.err.println("Communication error");

    e.printStackTrace();

    }

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    public static void main(String[] args) {

    new CHelloWrod();

    }

    }

    //:---;

    代码意思在代码中已经说得很清楚了,这里就不多累赘,运行得到以下结果:

    /home/roadahead/workspace/consider/hello.exe

    I output hello0

    list: hello0

    I output hello1

    list: hello1

    I output hello2

    list: hello2

    I output hello3

    list: hello3

    I output hello4

    list: hello4

    I output hello5

    list: hello5

    I output hello6

    list: hello6

    I output hello7

    list: hello7

    I output hello8

    list: hello8

    I output hello9

    list: hello9

    证明运行正确,java调用C程序代码已经成功,至于该怎样利用就看个人了。

    各位朋友,如果有什么不对的地方尽管指点,谢谢

    展开全文
  • Java程序如何调用C/C++语言函数导语:我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。 下面就由小编为大家介绍一下Java程序如何调用C/C++语言函数,欢迎大家阅读!JNI是...
  • 在Linux系统下,JAVA程序通过JNA技术实现调用C语言编程输出的so库接口函数,从而实现java程序c程序之间的交互。
  • 拉丁的传说要在java调用c语言的库,需要使用Java提供了JNI。举例说明在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java调用这个函数显示Hello Word.现在分别从JavaC语言两部分说明:1. Java ...
  • Java如何调用C程序,JNI技术

    万次阅读 2019-06-16 00:36:26
    Java如何调用C语言程序,JNI技术 Java为什么要调用C语言编写的程序 因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就...
  • Oracle调用第三方外部程序。Oracle使用sqluldr2快速导出大批量数据,然后用winrar压缩后发送邮件。 源码 java source create or replace and compile java source named jv_run_extpro as import java.io.*; ...
  • java程序调用c语言

    千次阅读 2017-01-09 17:08:23
    1.写一个调用C程序的类 例如一个简单的字符串输入输出类: package com.lxy; public class Test { public static void main(String[] args) { TestC t = new TestC(); t.set("abc"); System.out.println...
  • 主要介绍了java调用c程序通信示例,大家参考使用吧
  • NULL 博文链接:https://201211131343.iteye.com/blog/1765723
  • JNI之JAVA调用C程序(linux环境) 因业务需求,需要对上传的文件做crc文件冗余校验,由于规则比较特殊一般JAVA的CRC校验无法得到正确的crc值,因此考虑使用JAVA调用C的方法实现。 JNI介绍 JNI是Java Native ...
  • JNI java调用c语言方法(Mac下)

    千次阅读 2018-04-23 21:59:20
    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和...】,即可在JAVA程序调用它们。 本教程对应Mac平台Idea开发工具,而且JDK版本不能高于1.8,否则javah将命令不可用。 1.项目准备 ...
  • 本文实例讲述了JavaScript调用客户端Java程序的方法。分享给大家供大家参考。具体如下: 一般说来,JavaScript是没有权限调用客户端可执行程序的。但有时有些特殊需要,又不得不调用。例如有时涉及客户端文件的操作...
  • JNI是Java Native Interface的缩写,中文可译为Java本地调用,它允许Java代码和其他语言写的代码进行交互,而我们在使用JNI的时候是让其与C语言通信,我们知道C语言是偏底层的语言,可以直接操作硬件,执行效率较高...
  • Java简单调用C语言函数

    千次阅读 2019-08-14 15:35:53
    Java简单调用C语言函数1.安装Dev-Cpp2.编写并编译Java代码3.新建工程4.修改C代码4.1将第2步生成的.h文件复制黏贴到dll.h里面4.2修改dllmain.cpp文件4.3 保存并编译4.4编译错误解决5.将编译好的dll文件放到java安装...
  • 慕田峪7331174要在java调用c语言的库,需要使用Java提供了JNI。举例说明在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java调用这个函数显示Hello Word.现在分别从JavaC语言两部分说明:1. ...
  • Java程序调用MySQL的存储过程

    千次阅读 2016-05-04 01:43:54
    前几天看了一下MySQL的存储过程和函数,自己就试验写了一个简单存储过程,由于一直都在学习Java,就想到了该如何在Java程序中调用存储过程和函数,今天百度了解...下边就是一个通过Java程序调用MySQL存储过程的小例子。
  • 4. Linux下通过JNA技术实现JAVA程序调用so库函数的实例。 4.1 开发环境 4.2 so库的生成 4.2.1 编写文件sayhello.h 4.2.2 编写文件sayhello.c 4.2.3 编写编译命令文件64cmd.sh和32cmd.sh 4.2.4 编译生成so库 ...
  • java jni 调用c语言函数

    2017-11-29 23:53:44
    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了...Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。 JNI是Java
  • 怎样能在Java中调用C语言生成的DLL文件以下这个例子实现的是通过调用C写的DLL,计算字符串长度。 一、 生成C的头文件 1. 编辑Main.java public class Main{public native stat...
  • jnaerator_JAVA程序调用C/C++库_方法三

    千次阅读 2018-07-19 10:47:54
    转载自大佬的博客: ... 众所周知,java程序如果要调用动态库(.so,.dll)的函数,最传统方式是使用JNI技术,用JNI写java调用接口代码是非常痛苦的,调试也是比较麻烦的事儿,JNA推出后,大大降低了开发难度...
  • 经过网上查找的资料和实践,可以在java界面中点击按钮调用C程序将结果显示到java的文本框中,里面有代码和步骤,祝你成功~~
  • 思路可能有些问题,但是方法是正确的,如有遇到不通的地方,可以留言提问。 1. 新建工程。新建工程的时候,按照普通新建工程的方法就可以...任务完成,运行程序,会发现,你已经可以成功的调用C语言中的方法了。
  • JNI_JAVA程序调用C/C++库_方法一

    千次阅读 2018-07-17 21:51:13
    java调用C/C++函数 通过Java调用C++代码编写的 *.dll 类库中封装的方法,本 Demo 中包含两个方法,一个是输出文本信息,无返回值;一个计算并返回两个整数之和。 1. 编写Java接口 package package test....
  • Java程序调用CMD批处理

    千次阅读 2015-09-16 09:04:39
    Java程序调用CMD批处理java程序调用cmd命令修改系统密码为当天日期:如:2015-09-15 当天密码为:20150915jdk内置的Runtime.getRuntime().exec(String cmd)命令可执行cmd命令行字符串代码:@author-张相逢 ...
  • 1.写Java程序 public class TestNativeMethod { //声明一个native方法,接收两个int型数字,返回最大值。Java中只写声明,待会儿用C程序写具体实现。 public native int max(int a, int b); // 加载dll文件,...
  • Java调用C语言编写的简单函数库

    千次阅读 2017-12-18 19:04:30
    一个最简单的HelloWorld程序来介绍一下JNI的最基本的使用方法:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 797,259
精华内容 318,903
关键字:

java程序怎么调用c

java 订阅