linux下java呼叫c/c++庫
阿新 • • 發佈:2019-02-13
本文僅作為自己測試過程的一些記錄。
由於在專案中想複用之前的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點選執行。