1. 程式人生 > >linux下java呼叫c/c++庫

linux下java呼叫c/c++庫

本文僅作為自己測試過程的一些記錄。

由於在專案中想複用之前的c程式碼介面以減少java開發的工作量,因此做了最簡單的HelloWorld測試。java呼叫C/C++庫是使用JNI介面。具體過程記錄如下:

1、在eclipse下建立一個名為nativeTest的java工程,在其中新建名為nativeTest包,新建名為HelloWorld的類。程式碼如下:

package nativeTest;

public class HelloWorld {
	static {
		System.loadLibrary("HelloWorld");
	}

	private native void greeting();

	public static void main(String[] args) {
		new HelloWorld().greeting();
	}

}

對上述工程進行進行編譯。

2、需要去建立符合JNI介面的HelloWorld庫。

(1) 生成標頭檔案,利用javah命令。在eclipse中配置javah的過程可以參考點選開啟連結

配置完javah之後就可以通過點選操作即可生成需要的標頭檔案。生成的標頭檔案如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class nativeTest3_HelloWorld */

#ifndef _Included_nativeTest3_HelloWorld
#define _Included_nativeTest3_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     nativeTest3_HelloWorld
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_nativeTest3_HelloWorld_greeting
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

(2) 下面就是我們將在Java中呼叫的C庫介面,和一般情況下的寫法有些不同,需要按照JNI介面形式。簡言之,根據標頭檔案的宣告去寫就可以了,需要包含上述標頭檔案,具體如下。

#include "nativeTest_HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_nativeTest3_HelloWorld_greeting(JNIEnv *env, jobject obj){

	printf("hello world native!!\n");
}

(3)編譯生成動態庫

gcc -fPIC -I /usr/local/java/jdk1.8.0_151/include/ -I /usr/local/java/jdk1.8.0_151/include/linux/ -shared  -o libHelloWorld.so HelloWorld.c 

其中-I後面跟的是jdk的標頭檔案路徑,需要根據自己的安裝路徑進行修改。

3、將生成的動態庫libHelloWorld.so放到/usr/lib下(此路徑為預設的執行時庫路徑)。

ps:當然也可以通過將動態庫路徑直接新增到LD_LIBRARY_PATH路徑下,我放到/usr/lib下僅僅是為了省事。

4、在eclipse點選執行。