成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java JNI 調(diào)用 so 動(dòng)態(tài)鏈接庫(kù)

SegmentFault / 3588人閱讀

摘要:實(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
#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)單的加法
}
編譯運(yù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ù)

補(bǔ)充

如果以其他方式調(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

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<