精华内容
下载资源
问答
  • Java程序如何调用C/C++语言函数导语:我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。 下面就由小编为大家介绍一下Java程序如何调用C/C++语言函数,欢迎大家阅读!JNI是...

    Java程序如何调用C/C++语言函数

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

    JNI是Java Native Interface的英文缩写,中文翻译为本地调用,自从Java 1.1开始就成为了Java标准的一部分。

    C/C++是系统级的编程语言,可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现,使用JNI可以调用现有的'本地库,极大地灵活了Java的开发。

    C/C++的效率是目前最好的语言,可以使用C/C++来实现一些实时性非常高的部分。 C/C++和Java本身都是非常流行的编程语言,一些大型软件中经常使用语言之间的混合编程。

    一、创建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++语言函数】相关文章:

    展开全文
  • 1、创建一个Java程序(TestJNI.java)定义原生的c函数。2、用javac编译TestJNI.java生成TestJNI.class。用javah带-jni参数编译TestJNI.class生成TestJNI.h文件,该文件中 定义了c的函数原型。在实现c函数的时候需要。3...

    下面是在ubuntu 下java jni调用C语言动态链接库的具体操作步骤。

    1、创建一个Java程序(TestJNI.java)定义原生的c函数。

    2、用javac编译TestJNI.java生成TestJNI.class。用javah带-jni参数编译TestJNI.class生成TestJNI.h文件,该文件中 定义了c的函数原型。在实现c函数的时候需要。

    3、创建Hello.c,实现TestJNI.h定义的函数。

    4、编译Hello.c生成libgoodlucky.so。

    5、在java虚拟机运行java程序TestJNI。

    1、Test.java 源文件

    public class TestJNI {

    static{

    System.loadLibrary("goodlucky");

    }

    public native void set(int value);

    public native int get();

    public static void main(String[] args) {

    TestJNI td=new TestJNI();

    td.set(10);

    System.out.println(td.get());

    }

    }

    2、javac TestJNI.java

    javah -jni Test

    生成了TestJNI.h文件

    内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */

    #include /* Header for class TestJNI */

    #ifndef _Included_TestJNI

    #define _Included_TestJNI

    #ifdef __cplusplus

    extern "C" {

    #endif

    /*

    * Class: TestJNI

    * Method: set

    * Signature: (I)V

    */

    JNIEXPORT void JNICALL Java_TestJNI_set

    (JNIEnv *, jobject, jint);

    /*

    * Class: TestJNI

    * Method: get

    * Signature: ()I

    */

    JNIEXPORT jint JNICALL Java_TestJNI_get

    (JNIEnv *, jobject);

    #ifdef __cplusplus

    }

    #endif

    #endif

    3、 TestJNI.c,内容如下

    #include #include "TestJNI.h"

    int i=0;

    JNIEXPORT void JNICALL Java_TestJNI_set

    (JNIEnv * env, jobject obj, jint j)

    {

    i=j;

    }

    JNIEXPORT jint JNICALL Java_TestJNI_get

    (JNIEnv * env, jobject obj)

    {

    return i;

    }

    4、

    生成:对象文件TestJNI.o

    gcc -Wall -fPIC -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux

    生成动态库libgoodlucky.so  注意这里的goodlucky 对应TestJNI.java中goodlucky。并且这里要以lib开头命名动态库.-Wall 显示错误和警告提示   -I(不是l,就是这个害死我了,汗)后面是 jni.h,jni_md.h的路径

    gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.o

    上面的两条命令等价于下面的命令:

    gcc -Wall -fPIC  -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux -shared -o libgoodlucky.so TestJNI.c

    编译器选项-fpic和链接器选项-shared

    修改.bash_profile文件,配置环境变量,由于生成的.so文件在当前目录下,故

    .bash_profile文件设置如下

    export LD_LIBRARY_PATH=./

    或者把生成的.so文件放到/usr/lib目录下也可以。

    5、java TestJNI

    进阶:

    1、在第四步中,编写makefile文件

    内容如下:

    libgoodlucky.so:TestJNI.o makefile

    gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.o

    TestJNI.o:TestJNI.c TestJNI.h

    gcc -Wall -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux

    cl:

    rm -rf *.o *.so

    格式如下:

    一个 makefile 主要含有一系列的规则,如下:

    A: B

    (tab)(tab)每个命令行前都必须有tab符号。

    具体可参考:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html

    参考见:

    http://watershitter.iteye.com/blog/477615#comments

    http://lwjlaser.iteye.com/blog/779270

    http://blog.csdn.net/kangkanglou/article/details/5807787

    思考若是java文件带有包路径呢?可以去动手做做

    展开全文
  • Java调用C/C++程序的实现(jni)1. 关于本地方法1. 如何声明本地方法?通过native关键字可以声明一个本地方法。/** * 获得一个输入的字符 */ public native char getChar();2. 怎么加载dll文件?static{ System....

    Java调用C/C++程序的实现(jni)


    转载请注明出处:http://blog.csdn.net/H28496/article/details/49787459

    1. 关于本地方法

    1. 如何声明本地方法?

    通过native关键字可以声明一个本地方法。

    /**
     * 获得一个输入的字符
     */
    public native char getChar();

    2. 怎么加载dll文件?

    static{
        System.loadLibrary("NativeConsole"); // 需要和dll文件的名字相同
    }

    3. 代码示例

    package zhp;
    
    /**
     * 一些和控制台有关的native类
     * @author 郑海鹏
     * @since 2015年11月11日
     */
    public class NativeConsole {
    
        static{
            System.loadLibrary("NativeConsole");
        }
    
        /**
         * 获得一个输入的字符
         */
        public native char getChar();
    
        /**
         * 设置控制台光标
         */
        public native void setCursorPosition(int row, int col);
    
        /**
         * 清屏
         */
        public native void cls();
    }

    2. 如何调用本地方法

    package zhp;
    
    public class Test {
    
        public static void main(String[] args) {
            NativeConsole nativeConsole = new NativeConsole();
            nativeConsole.cls();    // 清屏
            nativeConsole.setCursorPosition(10, 10); // 设置光标位置
    
            while(true){
                char c = nativeConsole.getChar();
                System.out.println("[" + c + "]");
                if(c == '#'){ // 输入#退出
                    break;
                }
            }
        }
    
    }

    3. 如何编译

    假设两个文件的路径为:
    C:\src\zhp\NativeConsole.java
    C:\src\zhp\Test.java

    操作流程如下:

    Created with Raphaël 2.1.0Start为你的计算机添加jdk/bin的路径到环境变量中切换工作目录到C:/src编译NativeConsole和Test类,生成*.class文件生成NativeConsole.h头文件打开VS2013,创建一个win32程序,选择空的dll项目将..\jdk_8_60\include下面的文件(包括文件夹)复制到..\Visual Studio 2013\VC\include文件夹下在VS项目的解决方案>头文件下添加一个现有项,把NativeConsole.h头文件加进去在VS项目的解决方案>源文件下新建一个cpp文件,实现NativeConsole.h中声明的那些方法64位将活动解决方案平台改为X64编译程序,生成NativeConsole.dll将编译好的dll程序复制到C:\src\文件夹下执行TestEndyesno

    1. 怎么生成*.class文件

        c:\src>javac -encoding utf-8 ./zhp/Test.java
        c:\src>javac -encoding utf-8 ./zhp/NativeConsole.java

    编码格式看情况可以去掉。

    2. 怎么生成*.h头文件

        c:\src>javah zhp.NativeConsole

    javah命令需要在包外面执行,且类名包含包名。生成的头文件放在了C:\src文件夹下。

    3. 怎么将活动解决方案平台改为X64

    在VS上 生成>配置管理器>活动解决方案平台>下拉选择新建>下拉键入或选择新平台>选择X64

    4. 怎么执行

    c:\src>java zhp/Test

    转载请注明出处:http://blog.csdn.net/H28496/article/details/49787459

    展开全文
  • [code="java"] ...当执行bat到调用java后,程序就停住等待被调用的java执行完毕,问题是被调用java程序是一个gateway性质,一直需要启动的程序,怎么让被调用的java仍然执行,而调用者继续执行下去?
  • 在用NDK中,可以使用 JNIEnv *env 来获取一些java使用的方法,比如: 代码:jclass cls_context = (*env)...但是直接写的android linux C 程序 没有传入的JNIEnv *env,这样情况下怎么调用java里面的类或者方法。求教
    在用NDK中,可以使用 JNIEnv *env 来获取一些java使用的方法,比如:

    代码:jclass cls_context = (*env)->FindClass(env, "android/content/Context");

    但是直接写的android linux C 程序 没有传入的JNIEnv *env,这样情况下怎么调用java里面的类或者方法。求教 
    展开全文
  • 上一篇文章讲解了怎么使用Java的jni,但那是使用Java的原生命令javac编译,javah生成头文件的,而实际开发肯定不能只用javac、javah这些命令以及繁琐的过程生成dll链接文件,太麻烦了,那怎么在eclipse中生成.h...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼javabridg什么的都搭建好了,可以调用到类,但是不可以调用到类中的方法,请问大神们这是什么一个情况....Fatal error: Uncaught [[o:Exception]:"java.lang.Exception: ...
  • gpu跑的是对应的gpu指令,并不是什么语言,cpu也一样。所有语言一样是要被编译成对应平台的机器指令。或者用解析器执行时转换成机器指令。...再配合其他API调用代码,只能用在Nvidia的GPU。Open...
  • EXT如何调用java程序

    2011-05-04 09:51:51
    [/code]这样, DictInfoPanel 是这样的 ,其实DictInfoPanel这里不知道该怎么写了 [code="javascript"]DictInfoPanel = function(node){ //获得右侧tab对象 Ext.Ajax.request({ waitMsg : '读取数据。...
  • Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等。保留字是为java预留的关键字,他们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字。识别java语言的...
  • ,请教一个问题: 现在Java 调C 代码( C...但是我现在测试 Java 调用C代码时,在C中同时也 调用Java 代码出现了问题(创建JVM时 失败。 在一些场景下 需要C 主动调用Java),大家之前遇到过这类场景么? 怎么解决,
  • JAVA调用C or C++的两种方式

    千次阅读 2017-08-23 17:31:26
    JAVA调用C or C++的两种方式 纵所周知安桌的应用最外层是JAVA写的,那么我们怎么用熟悉的C 或C++来写程序了。这儿有两种方法。 第一种:建产JNI(C或C++写的文件),在这个文件中jniRegisterNativeMethods(env,...
  • Java跨平台的特性使Java...怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗
  • 谁知道java管道进程间怎么调用?注意是进程间!!不要有c程序出现,只要java的,谢谢!!!!
  • 如何在C/C++中调用Java

    2021-03-02 02:09:59
    Java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发...通过这种技术,开发人员不一定要用命令行来启动Java程序,可以通过编写一个本地GUI程序直接启动Java程序,这样就可避免另外打
  • c/c++调用Java

    2017-01-10 21:24:21
    怎么能够让通过Java开发的GUI程序不弹出JJava跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一个控制台窗口,这个控制台
  • CC调用JAVA

    2010-01-08 15:30:41
    Java跨平台的特性使...怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗...
  • 我的java程序是bat调用jar包启动的࿰c;运行一段时间会出现JAVA SE。。。 已停止运行的弹框࿰c;这个时候java进程也没关闭࿰c;是处于一种卡死阻塞的状态࿰c;浏览器访问系统会一直连接响应࿰c;但是...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼javabridg什么的都搭建好了,可以调用到类,但是不可以调用到类中的方法,请问大神们这是什么一个情况....Fatal error: Uncaught [[o:Exception]:"java.lang.Exception: ...
  • C/C++中调用Java

    2015-10-04 12:54:00
    Java跨平台的特性使Java...怎么能够让颠末Java启示的GUI程序不弹出Java的管教台窗口呢? 真实那时得多风行的开荒情况好比JBuilder、Eclipse都是使用纯Java开拓的集成情况。这些集成环境发动的时辰切实不会掀开一...
  • java调用SSIS java调用dtsx包 代码+图示

    千次阅读 2013-04-27 09:21:59
    可是要怎么应用到我的java web程序呢。苦于网上资料很少,去微软的msdn上提问了,也无果。 去google上搜索,翻了好多页,终于找到了,不过是英文的,翻译出来,啊哈,看到了,代码如下: /**  * Copyright (c) ...
  • 我有多个使用Cron驱动的调度策略运行的GetSplunk处理器. Cron表达式看起来像’0 30 13 * *?’.它们都在第一次运行时... NiFi中的Cron调度程序是QuartzScheduler.WARN [Timer-Driven Process Thread-7] o.a.n.c.t....
  • 如何在C/C++中调用Java的方法

    千次阅读 2018-04-26 11:46:18
    Java跨平台的特性使...怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗...
  • 这一设计允许了底层代码调用在高层定义的子程序。以上是维基百科对“回调函数”的定义。对于回调,不同的语言有不同的回调形式,例如:C、C++ 允许将函数指针作为参数传递;JavaScript、Python 允许将函数名作为参数...
  • java程序与操作系统API的关系

    千次阅读 2016-09-13 01:36:00
    java程序与操作系统API的关系  操作系统会将涉及到系统级别的功能的接口暴露出来给应用层调用,比如window下的c/c++/c#编程,可以调用系统的库函数。然而对于java程序,他是不能直接...1.java程序怎么使
  • 1.C语言,C++,怎么写主函数主函数的作用是程序的入口。就是说只要程序一开始,第一句执行的就是主函数中的第一条语句。编写规律:主函数一般是调用函数和简单的逻辑判断,代码长度不宜超过80行。技巧:将功能尽量整合...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 326
精华内容 130
关键字:

java程序怎么调用c

java 订阅