實現一個最簡單的 JNI 調用java
package sf.gg; public class Hello{ public native static int add(int x,int y); //java 代碼中聲明 native 方法 static { System.load("/home/lance/main.so"); //以絕對路徑加載so文件 } public static void main(String[] args){ System.out.println(add(1,1)); } }
編譯 java 代碼 javac -d . Hello.java
linux
命令解釋: -d:表示生成目錄,生成的目錄以package的定義爲準;
.:表示在當前所在文件夾中生成ubuntu
查看生成的文件和目錄vim
ls -al
首先生成.h
頭文件oracle
javah sf.gg.Hello
查看生成的 sf_gg_Hello.h
文件jvm
vim sf_gg_Hello.h
以下:.net
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class sf_gg_Hello */ #ifndef _Included_sf_gg_Hello #define _Included_sf_gg_Hello #ifdef __cplusplus extern "C" { #endif /* * Class: sf_gg_Hello * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_sf_gg_Hello_add (JNIEnv *, jclass, jint, jint); #ifdef __cplusplus } #endif #endif
編寫實現add
方法的 C 代碼code
vim hello.c
代碼以下:blog
#include<stdio.h> #include "sf_gg_Hello.h" JNIEXPORT jint JNICALL Java_sf_gg_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){ return x+y; //簡單的加法 }
OS: ubuntu 14.04 ltsget
gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-8-oracle/include -I/usr/lib/jvm/java-8-oracle/include/linux -c hello.c
命令解釋: man gcc
注意:須要命令中的/usr/lib/jvm/java-8-oracle/include
須要換成本機的 jdk 對應的目錄
生成 so 庫
gcc hello.o -o main.so -shared
查看生成的文件
ls -al
運行
java sf.gg.Hello
編寫帶有native聲明的方法的Java類
使用javac命令編譯編寫的Java類
使用javah ...來生成後綴名爲.h的頭文件
使用其餘語言(C、C++)實現本地方法
將本地方法編寫的文件生成動態連接庫
若是以其餘方式調用,出現no dll或so in java.library.path
,參考此文:JAVA WEB項目加載dll文件失敗,no xxx in java.library.path
輸出系統 java.library.path
public class PrintPath{ public static void main(String[] args){ System.out.println(System.getProperty("java.library.path")); } }
其它相關資料參考:
System.load 和 System.loadLibrary詳解 1