一、环境介绍

    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!