首页 > 软件开发 > JAVA >

Java通过-jni调用c语言

来源:互联网 2023-03-16 19:31:44 406

在Ubuntu14.04中通过Java调用c语言4gl办公区 - 实用经验教程分享!

工具/原料

  • Ubuntu14.04
  • 已安装过JDK

方法/步骤

  • 1

    (1)首先编写一个简单的Java程序。4gl办公区 - 实用经验教程分享!

    public class TestJNI {4gl办公区 - 实用经验教程分享!

    static{4gl办公区 - 实用经验教程分享!

    System.loadLibrary("diaoyong"); //程序在加载时,自动加载libdiaoyong.so库4gl办公区 - 实用经验教程分享!

    }4gl办公区 - 实用经验教程分享!

    public native void set(int value); //声明原生函数。注意要添加native关键字4gl办公区 - 实用经验教程分享!

    public native int get();4gl办公区 - 实用经验教程分享!

    public static void main(String[] args) {4gl办公区 - 实用经验教程分享!

    TestJNI test=new TestJNI();4gl办公区 - 实用经验教程分享!

    test.set(1);4gl办公区 - 实用经验教程分享!

    System.out.println(test.get());4gl办公区 - 实用经验教程分享!

    }4gl办公区 - 实用经验教程分享!

    } 4gl办公区 - 实用经验教程分享!

  • 2

    (2)用javac编译TestJNI.java文件生成TestJNI.class文件4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 2此文章非法爬取自百度经验
  • 3

    (3)用javah带-jni参数编译TestJNI.class文件生成TestJNI.h文件。该文件中定义了c的函数原型。在实现c函数的时候需要。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 4

    (4)生成的TestJNI.h文件如下:4gl办公区 - 实用经验教程分享!

    /* DO NOT EDIT THIS FILE - it is machine generated */4gl办公区 - 实用经验教程分享!

    #include jni.h>4gl办公区 - 实用经验教程分享!

    /* Header for class TestJNI */4gl办公区 - 实用经验教程分享!

    #ifndef _Included_TestJNI4gl办公区 - 实用经验教程分享!

    #define _Included_TestJNI4gl办公区 - 实用经验教程分享!

    #ifdef __cplusplus4gl办公区 - 实用经验教程分享!

    extern "C" {4gl办公区 - 实用经验教程分享!

    #endif4gl办公区 - 实用经验教程分享!

    /*4gl办公区 - 实用经验教程分享!

    * Class: TestJNI4gl办公区 - 实用经验教程分享!

    * Method: set4gl办公区 - 实用经验教程分享!

    * Signature: (I)V4gl办公区 - 实用经验教程分享!

    */4gl办公区 - 实用经验教程分享!

    JNIEXPORT void JNICALL Java_TestJNI_set(JNIEnv *, jobject, jint);4gl办公区 - 实用经验教程分享!

    /*4gl办公区 - 实用经验教程分享!

    * Class: TestJNI4gl办公区 - 实用经验教程分享!

    * Method: get4gl办公区 - 实用经验教程分享!

    * Signature: ()I4gl办公区 - 实用经验教程分享!

    */4gl办公区 - 实用经验教程分享!

    JNIEXPORT jint JNICALL Java_TestJNI_get(JNIEnv *, jobject);4gl办公区 - 实用经验教程分享!

    #ifdef __cplusplus4gl办公区 - 实用经验教程分享!

    }4gl办公区 - 实用经验教程分享!

    #endif4gl办公区 - 实用经验教程分享!

    #endif4gl办公区 - 实用经验教程分享!

    这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使Java的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是Java_再加上Java程序的package路径再加函数名组成的。参数中, 我们也只需要关心在Java程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。4gl办公区 - 实用经验教程分享!

  • 5

    (5)编写c语言去实现这些方法,一个简单的代码如下:4gl办公区 - 实用经验教程分享!

    #include stdio.h>4gl办公区 - 实用经验教程分享!

    #include "TestJNI.h"4gl办公区 - 实用经验教程分享!

    int i=0;4gl办公区 - 实用经验教程分享!

    JNIEXPORT void JNICALL Java_TestJNI_set (JNIEnv * env, jobject obj, jint j)4gl办公区 - 实用经验教程分享!

    {4gl办公区 - 实用经验教程分享!

    i=j*888;4gl办公区 - 实用经验教程分享!

    } 4gl办公区 - 实用经验教程分享!

    4gl办公区 - 实用经验教程分享!

    JNIEXPORT jint JNICALL Java_TestJNI_get (JNIEnv * env, jobject obj)4gl办公区 - 实用经验教程分享!

    {4gl办公区 - 实用经验教程分享!

    printf("ok!You have successfully passed the Java call c\n");4gl办公区 - 实用经验教程分享!

    return i;4gl办公区 - 实用经验教程分享!

    }4gl办公区 - 实用经验教程分享!

  • 6

    (6)生成对象文件TestJNI.o。(注意:这里面的路径/usr/lib/jvm/java/是JDk安装的路径,所以大家应根据自己的JDK路径设置。Jni_md.h和Jni.h分别在JDK的/include/linux与/include/目录下。)-Wall:打开警告开关。-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 7

    (7)生成动态链接库libdiaoyong.so文件,(注意:动态链接库的名字必须是 lib*.so,因为编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称。这里是libdiaoyong.so对应于Java程序里的diaoyong)选项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中。-shared指编译后会链接成共享对象。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 8

    (8)配置环境变量,我看了网上大多都是修改/home/用户目录/下的.bash_profile文件,但有的机器上没有这个文件,那么就去创建一个就行了。而我的方法直接在/home/用户目录/下的.bashrc文件(也就是我们配置环境变量的文件)进行设置。上面两种方法的设置内容是一样的,如下:4gl办公区 - 实用经验教程分享!

    export LD_LIBRARY_PATH=./4gl办公区 - 实用经验教程分享!

    下面我就以我的方法为例做详细操作。4gl办公区 - 实用经验教程分享!

    先进入到/home/用户目录/下,用ls –al命令(可用于查看隐藏文件)查看.bashrc文件。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 9

    然后用vi编辑器或gedit编辑器打开.bashrc文件。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 10

    输入红线框中内容:(注意.bashrc文件里面有好多环境变量设置不要随意更动)LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 11

    让.bashrc中设置立即加载4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 12

    (9)运行Java程序,实现去调用c语言。(注意:一定要回到Java文件所在目录运行,不然会找不到文件)。4gl办公区 - 实用经验教程分享!

    Java通过-jni调用c语言4gl办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!4gl办公区 - 实用经验教程分享!


    标签: JAVA

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码