摘要:實現一個最簡單的調用編寫代碼代碼中聲明方法以絕對路徑加載文件編譯代碼命令解釋表示生成目錄,生成的目錄以的定義為準表示在當前所在文件夾中生成查看生成的文件和目錄編寫代碼首先生成頭文件查看生成的文件如下編寫實現方法的代碼代碼如下簡單的
實現一個最簡單的 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
命令解釋: -d:表示生成目錄,生成的目錄以package的定義為準;
.:表示在當前所在文件夾中生成
查看生成的文件和目錄
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
編寫實現add 方法的 C 代碼
vim hello.c
代碼如下:
#include編譯運行#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 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 需要換成本機的 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
System.load 和 System.loadLibrary詳解 2
linux/Ubuntu 下使用 java 調用 so 動態鏈接庫詳細步驟
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64146.html
閱讀 2928·2021-10-14 09:43
閱讀 2867·2021-10-14 09:42
閱讀 4639·2021-09-22 15:56
閱讀 2355·2019-08-30 10:49
閱讀 1587·2019-08-26 13:34
閱讀 2370·2019-08-26 10:35
閱讀 590·2019-08-23 17:57
閱讀 2022·2019-08-23 17:15