国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java JNI 調用 so 動態鏈接庫

SegmentFault / 3568人閱讀

摘要:實現一個最簡單的調用編寫代碼代碼中聲明方法以絕對路徑加載文件編譯代碼命令解釋表示生成目錄,生成的目錄以的定義為準表示在當前所在文件夾中生成查看生成的文件和目錄編寫代碼首先生成頭文件查看生成的文件如下編寫實現方法的代碼代碼如下簡單的

實現一個最簡單的 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

相關文章

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<