Linux下java调用c的动态库

1.编写HelloJNI.java文件(包名为JNI)java

package JNI;
public class HelloJNI
{
    static
    {
     System.load("/root/lib/goodluck.so");    //使用绝对路径加载名称为goodluck.so的库文件
       // System.loadLibrary("goodluck");    //使用默认路径加载
    }
    public native static int get();   //native关键字
    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());//若是成功,控制台会打印出10。
    }
}linux

2.编译HelloJNI.java文件成为.class文件spa

 javac -d . HelloJNI.java  //编译出带有包的class文件,以这个为例get

 javac -d . HelloJNI.java //编译出不带包名的class文件编译

3.根据class文件生成.h头文件class

注意:得在包名的起始位置进行编译点h头文件test

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

#include "JNI_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_JNI_HelloJNI_get(JNIEnv *env, jclass jc)
{
    return i;
}
JNIEXPORT void JNICALL Java_JNI_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
    i = j;
}引用

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

 

gcc -fPIC -D_REENTRANT -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -c HelloJNI.c 

注:$JAVA_HOME/include 是jni.h头文件所在的路径
     $JAVA_HOME/include/linux是jni_md.h所在的路径

为了方即可以写成sh来执行

若是找不到jni.h和jni_md.h路径,根目录下执行 find -name jni.h    find -name jni_md.h  而后pwd查看,再全路径引用便可。

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

gcc -shared HelloJNI.o -o goodluck.so//用绝对路径load的话能够生成和load相同的文件名字

gcc -shared HelloJNI.o -o libgoodluck.so//使用loadLibrary(System.loadLibrary("goodluck");    使用默认路径加载)的话,须要默认以lib开头。

在Linux平台上,遵循JNI规范的动态连接库文件名必须以“lib”开头。例如在上面的Java程序中指定的库文件名为“goodluck”,则实际的库文件应该命名为“libgoodluck.so”。

7.将第6步中生成的goodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。

根目录下mkdir lib //新建lib文件夹

把goodluck.so文件拷贝到该目录下

注:也能够在别的地方新建目录,只要在java文件引用库可以load到。

8.执行class文件

 

相关文章
相关标签/搜索