摘要:實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的調(diào)用編寫代碼代碼中聲明方法以絕對(duì)路徑加載文件編譯代碼命令解釋表示生成目錄,生成的目錄以的定義為準(zhǔn)表示在當(dāng)前所在文件夾中生成查看生成的文件和目錄編寫代碼首先生成頭文件查看生成的文件如下編寫實(shí)現(xiàn)方法的代碼代碼如下簡(jiǎn)單的
實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的 JNI 調(diào)用
編寫 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"); //以絕對(duì)路徑加載so文件 } public static void main(String[] args){ System.out.println(add(1,1)); } }
編譯 java 代碼 javac -d . Hello.java
命令解釋: -d:表示生成目錄,生成的目錄以package的定義為準(zhǔn);
.:表示在當(dāng)前所在文件夾中生成
查看生成的文件和目錄
ls -al編寫C代碼
首先生成.h頭文件
javah sf.gg.Hello
查看生成的 sf_gg_Hello.h 文件
vim sf_gg_Hello.h
如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */ #include/* 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
編寫實(shí)現(xiàn)add 方法的 C 代碼
vim hello.c
代碼如下:
#include編譯運(yùn)行#include "sf_gg_Hello.h" JNIEXPORT jint JNICALL Java_sf_gg_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){ return x+y; //簡(jiǎn)單的加法 }
OS: ubuntu 14.04 lts
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 需要換成本機(jī)的 jdk 對(duì)應(yīng)的目錄
生成 so 庫(kù)
gcc hello.o -o main.so -shared
查看生成的文件
ls -al
運(yùn)行
java sf.gg.Hello總結(jié)
編寫帶有native聲明的方法的Java類
使用javac命令編譯編寫的Java類
使用javah ...來生成后綴名為.h的頭文件
使用其他語(yǔ)言(C、C++)實(shí)現(xiàn)本地方法
將本地方法編寫的文件生成動(dòng)態(tài)鏈接庫(kù)
如果以其他方式調(diào)用,出現(xiàn)no dll或so in java.library.path ,參考此文:JAVA WEB項(xiàng)目加載dll文件失敗,no xxx in java.library.path
輸出系統(tǒng) java.library.path
public class PrintPath{ public static void main(String[] args){ System.out.println(System.getProperty("java.library.path")); } }
其它相關(guān)資料參考:
System.load 和 System.loadLibrary詳解 1
System.load 和 System.loadLibrary詳解 2
linux/Ubuntu 下使用 java 調(diào)用 so 動(dòng)態(tài)鏈接庫(kù)詳細(xì)步驟
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64146.html
閱讀 2967·2021-10-14 09:43
閱讀 2915·2021-10-14 09:42
閱讀 4707·2021-09-22 15:56
閱讀 2387·2019-08-30 10:49
閱讀 1610·2019-08-26 13:34
閱讀 2401·2019-08-26 10:35
閱讀 627·2019-08-23 17:57
閱讀 2050·2019-08-23 17:15