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

jopen 10年前

首先,编写一个Java文件,包含有native方法

public class MyJni {      public native void display();        public native double sum(double x, double y);        public static void main(String[] args) {               }    }
其次,将此Java文件编译成.h文件
javah MyJni

执行完此命令,会在目录下生产一个MyJni.h文件

第三,编写一个.c文件,引入刚才的头文件

#include <jni.h>  #include "MyJni.h"  #include <stdio.h>    JNIEXPORT void JNICALL Java_MyJni_display(JNIEnv *env,jobject obj){        printf("Hello JNI");      return;  }    JNIEXPORT jdouble JNICALL Java_MyJni_sum(JNIEnv *env,jobject obj,jdouble a,jdouble b){        return a+b;  }
第四,将.c文件编译成.o,再重新转换成.so或者.dll文件
gcc -fPIC -D_REENTRANT -I JDK路径/jdk1.8/include -I JDK路径/jdk1.8/include/linux -c MyJni.c
上面的命令会将C文件编译成.o文件。
gcc -shared Test.o -o libtest.so

上面的命令就能将.o文件编译成.so文件了。


在刚才的java方法中测试一下

public class MyJni {        static {          System.load("绝对路径/libtest.so");      }        //使用jni的关键字native      //这个关键字决定我们那些方法能够在C文件使用      //只须声明,不必实现      public native void display();        public native double sum(double x, double y);        public static void main(String[] args) {          MyJni myJni = new MyJni();          System.out.print(myJni.sum(1, 1));          System.out.print("\n");          myJni.display();      }    }



来自:http://my.oschina.net/simaben/blog/322850