Java JNI 調用 so 動態連接庫

實現一個最簡單的 JNI 調用java

編寫 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.javalinux

命令解釋: -d:表示生成目錄,生成的目錄以package的定義爲準;
.:表示在當前所在文件夾中生成ubuntu

查看生成的文件和目錄vim

ls -al

編寫C代碼

首先生成.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

總結

  1. 編寫帶有native聲明的方法的Java類

  2. 使用javac命令編譯編寫的Java類

  3. 使用javah ...來生成後綴名爲.h的頭文件

  4. 使用其餘語言(C、C++)實現本地方法

  5. 將本地方法編寫的文件生成動態連接庫

補充

若是以其餘方式調用,出現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 動態連接庫詳細步驟

相關文章
相關標籤/搜索