Linux平台使用JNI的例子 Java调用so

1.确保gcc编译器已安装

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

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头文件,本例中生成的头文件名为com_hhiiuxx_test_HelloJNI.h
javah com.hhiiuxx.test.HelloJNI

5.编写HelloJNI.c文件,实现引用第4步中生成的.h头文件,并实现其中声明的方法。
[代码]
#include "com_hhiiuxx_test_HelloJNI.h"

int i = 0;

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

JNIEXPORT void JNICALL Java_com_hhiiuxx_test_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/hhiiuxx/lib
2) 把libgoodluck.so文件拷贝到该目录下
3)打开Terminal,运行如下命令
export LD_LIBRARY_PATH=/home/hhiiuxx/lib
只在当前shall下有效...

9.在运行HelloJNI.class
java com.hhiiuxx.test.HelloJNI

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

相关推荐