• Linux平台Java调用so库-JNI使用例子


    转自:http://blog.chinaunix.net/uid-20180960-id-1972669.html

    Linux平台Java调用so库-JNI使用例子
    2010-08-11 22:17
     

    1.确保gcc编译器已安装

    2.编写HelloJNI.java代码,用native声明需要用C实现的函数。
    如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/test/net/wangliping/HelloJNI.java

    package net.wangliping

    public class HelloJNI
    {
        static
        {

            System.loadLibrary("goodluck");
        }

        public native static int get();
        public native static void set(int i);

        public static void main(String[] args)
        {
            HelloJNI test = new HelloJNI();
            test.set(10);
            System.out.println(test.get());
        }
    }

    3.在HelloJNI.java文件所在目录下编译.java文件。

    javac HelloJNI.java

    4.在~/Desktop下编译第三步中生成的.class文件,生成对应的.h头文件,本例中生成的头文件名为 net_wangliping_HelloJNI.h

    javah net.wangliping.HelloJNI

    5.编写HelloJNI.c文件,实现引用第4步中生成的.h头文件,并实现其中声明的方法。

    #include "net_wangliping_HelloJNI.h"

    int i = 0;

    JNIEXPORT jint JNICALL Java_net_wangliping_HelloJNI_get(JNIEnv *env, jclass jc)
    {
        return i;
    }

    JNIEXPORT void JNICALL Java_net_wangliping_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
    {
        i = j;
    }

    6.将第5步中编写的HelloJNI.c文件,编译成.o文件

    gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c HelloJNI.c

    注:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include 是jni.h头文件所在的路径
    /usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux 是jni_md.h所在的路径

    7.将第6步中生成的HelloJNI.o文件编译成.so库文件

    gcc -shared HelloJNI.o -o libgoodluck.so

    注:和windows下不同,linux的库文件必须是以libxxx.so形式命令的(或者 libxxx.so.y,y是版本号),lib前缀是为了系统能够识别它,xxx是java代码System.loadLibrary("xxx");中引用库的名字。

    8.将第7步中生成的libgoodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。
    前提是你有足够的权限,如果没有sudo权限的同学,用下面的方法:
    1) 在/home下建立一个用来存放.so库文件的目录,比如/home/swan/lib
    2) 把libgoodluck.so文件拷贝到该目录下
    3)打开Terminal,运行如下命令

    export LD_LIBRARY_PATH=/home/swan/lib

    只在当前shell下有效...

    本博主转烛补充:以下方法可以直接利用绝对路径来load这个so库文件,从而无需做上述的放置path或者更改库路径的动作。

    static {
        System.load("/home/swan/test/libgoodluck.so");
    }

    9.在运行HelloJNI.class

    java net.wangliping.HelloJNI

    一切正常后,可以看到运行結果是输出了10,其值是由C语言代码实现并返回的。

  • 相关阅读:
    14款经典的MySQL客户端软件
    淘宝、百度软件工程师们小调皮,各种霸气外漏
    使用Navicat for Oracle工具连接oracle出错:ORA-12737
    解析xlsx与xls--使用2012poi.jar
    LUOGU P4163 [SCOI2007]排列
    LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
    LUOGU P1438 无聊的数列 (差分+线段树)
    LUOGU P1967 货车运输(最大生成树+树剖+线段树)
    LUOGU P3382 【模板】三分法 (三分)
    LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)
  • 原文地址:https://www.cnblogs.com/x_wukong/p/4625302.html
Copyright © 2020-2023  润新知