一、环境介绍
VMwareWorkstation9.0 + RedHat5.1Enterprise + jdk1.7.0
二、第一个使用JNI的hello程序步骤
1、编写一个使用jni调用的简单Java程序
package org.bt.test public class HelloJni { private native String getHello(); //申明本地函数 //加载共享库 static { System.loadLibrary("bigtree"); } public static void main(String[] args) { Strig str = new HelloJni().getHello(); //调用本地函数 System.out.println("message from jni: " + str); } }
其中用native修饰的函数由C实现,并且制作成共享库,因此要提前使用静态代码块加载共享库,其中加载的共享库名字不包含lib头和.so尾
2。编译Java文件,生成.class字节码文件
javac -d . HelloJni.java
编译完成后将生成包目录以及.class文件
3.使用javah命令对包含native函数的.java文件生成本地函数的头文件,注意要在包目录的根目录下进行
javah org.bt.test.HelloJni
其中org.bt.test为包名,HelloJni为Java文件的名字,不包含后缀,成功后将在本目录下生成一个
包名_文件名.h 如:org_bt_test_HelloJni.h
4.包含此头文件,编写c代码,实现本地函数
#include "org_bt_test_HelloJni.h" JNIEXPORT jstring JNICALL Java_org_bt_test_HelloJni_getHello(JNIEnv *env, jobject obj) { jstring str = (*env)->NewStringUTF(env, "hello world!"); return str; }
其中函数原型在头文件中已经用javah生成了,只需实现即可,此函数将给Java程序返回一个helloworld!字符串。注意:.h文件和.c文件在同一个目录下,c文件名任意取
5.编译c代码,制作成共享库
gcc -fPIC -I /usr/java/jdk1.7.0_51/include/ -I /usr/java/jdk1.7.0_51/include/linux/ -shared -o libbigtree.so hello.c
-fPIC 制定编译成与路径无关的
-I 制定要搜索的头文件的路径
-shared 制定生成共享库
-o 制定输入文件名字,其中lib开头,.so结束,中间的名字就是Java程序中加载的共享库使用的名字,两者必须一致
hello.c即为要制作成共享库的c代码
6、修改环境变量LD_LIBRARY_PATH,使系统能知道在哪里加载自己制作的共享库的路径,这里简单起见,就设置为当前路径
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
linux下用冒号分隔,这种修改方法只是当时有效,重启系统后就没有效了,要想一直都有效,就的修改配置文件,一般修改/etc/profile
7.运行Java程序
java org/bt/test/HelloJni
成功后将打印出message from jni: hello world!