• ubuntu下在java代码中调用c代码


    我的ubuntu版本为10.04,使用wubi安装的

    1)在ubuntu下安装jdk1.6,安装方法有两种,一种是自动安装,安装完后自动配置好环境变量等,一种是手动安装,下载好jdk,安装好再自己去配置jdk的环境变量,,由于后续的一些操作和手动配置相关,所以本文采用jdk的手动安装。

    jdk的自动安装,可以参考此博文,写的很详细:http://chirs1012f.iteye.com/blog/969038

    jdk的手动安装,可以参考博文:http://chirs1012f.iteye.com/blog/981114

    jdk安装好后,我的jdk安装目录如下:

    2)在安装并且配置好jdk环境变量后,开始编写java代码,取名为HelloWorld.java,代码如下:

    View Code
     1 class HelloWorld {
    2 //你要调用的c函数声明
    3 private native void print();
    4 public static void main(String[] args) {
    5 new HelloWorld().print();
    6 }
    7 //加载动态链接库
    8 static {
    9 System.loadLibrary("HelloWorld");
    10 }
    11 }

    我的java文件目录如下图所示,目录的位置随便,只要在命令行中与其一致就行:

    用javac命令,生成class文件,首先定位到文件所在目录下,如图


    执行命令:javac HelloWorld.java,可以看到该目录下多了HelloWorld.class文件,如图所示:

    如果在执行javac HelloWorld.java命令时没有生成class文件,需要先做如下操作,为了方便,将javah也做了替换,

    1:sudo update-alternatives --install /usr/bin/java java /usr/lib/java/jdk1.6.0_24/bin/java 300

    2:sudo update-alternatives --install /usr/bin/javac javac /usr/lib/java/jdk1.6.0_24/bin/javac 300

    3:sudo update-alternatives --install /usr/bin/javah javah /usr/lib/java/jdk1.6.0_24/bin/javah 300

    4:sudo update-alternatives --config java 

    需要将前3条中的  /usr/lib/java/jdk1.6.0_24/bin/javac 替换为你自己的jdk安装目录,我的就替换为

    /home/zhangjl/jdk1.6.0_24/bin/java

    /home/zhangjl/jdk1.6.0_24/bin/javac

    /home/zhangjl/jdk1.6.0_24/bin/javah

    之后在执行javac HelloWorld.java,生成class文件。

    3)生成头文件:执行  javah -jni HelloWorld,之后如图所示:

    如不能生成头文件,可以试试sudo  javah -jni HelloWorld

    4)编写c文件,文件名为HelloWorld.c,代码如下:

    View Code
    #include <jni.h>
    #include <stdio.h>
    #include "HelloWorld.h"

    JNIEXPORT void JNICALL
    Java_HelloWorld_print(JNIEnv *env, jobject obj)
    {
    printf("Hello World!\n");
    return;
    }

    5)编译HelloWorld.c并生成动态链接库libHelloWorld.so,在linux下,使用如下命令:

    View Code
    gcc -fpic -shared HelloWorld.c -I /home/zhangjl/jdk1.6.0_24/include/ -I /home/zhangjl/jdk1.6.0_24/include/linux/ -o libHelloWorld.so

    具体的参数含义可以参考博文:

    http://wiki.ubuntu.org.cn/index.php?title=Gcchowto&variant=zh-cn

    http://wiki.ubuntu.org.cn/index.php?title=Compiling_C&variant=zh-cn

    6)最后,执行命令,打印出输出语句

    java HelloWorld

    如果提示找不到类的提示错误,需要配置一下java的运行环境,我修改的是/etc/environment文件,

    用vim打开/etc/environment文件,命令为sudo vim  /etc/environment,打开后如下:

    注意:PATH中的/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games必须保留,否则会导致系统登录不了。

    按字母键 i,进入修改模式,在CLASSPATH后添加   :.,将当前目录添加到运行环境中去,编辑完成后,按 Esc键,再按输入:wq,保存退出,

    输入以下命令,使其生效:source /etc/environment

    再次执行java HelloWorld,报如下错误,

    原因是找不到so文件,可以参考第五步骤的博文,使用命令:

    LD_LIBRARY_PATH=.

    export LD_LIBRARY_PATH,

    再次执行java HelloWorld,即可输出想要的结果!

    如有讲的不正确的地方,敬请指出,谢谢!

    
    





  • 相关阅读:
    洛谷P6276 [USACO20OPEN]Exercise P(生成函数)
    牛顿迭代求逆元
    线性基求交
    我卷我自己加强
    AGC013 简要题解
    LOJ#6074 「2017 山东一轮集训 Day6」
    JAVA根据下载地址获取文件的Base64
    JS 作用链,箭头函数 this 取值
    Leetcode 1249 移除无效的括号
    Vue的数据绑定
  • 原文地址:https://www.cnblogs.com/zhangjl/p/2390234.html
Copyright © 2020-2023  润新知