java程序如何調用c/c++庫中的函數主要分為三個步驟:
1. 加載庫文件. System.loadLibrary
2. 找到函數( java函數<----映射---->c函數 )
3. 調用函數
在映射中一般分為顯式建立和隱式建立。
顯式建立:
下面舉個例子:
/* filename native.c commod: gcc -shared -o libnative.so native.c -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include -fPIC */ #include <stdio.h> #include <jni.h> /* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include */ int c_hello( JNIEnv *env, jobject cls, jint num ) { printf("hello c/c++ num=%d\r\n",num); return num*2; } /* 2. java <--> C */ static const JNINativeMethod methods[] = { {"hello","(I)I",(void *)c_hello}, /* java function 參數 c function*/ }; JNIEXPORT jint JNICALL JNI_OnLoad( JavaVM *jvm, void *reserved ) { JNIEnv *env; jclass cls; /* 獲取運行環境 */ if((*jvm)->GetEnv(jvm,(void **)&env,JNI_VERSION_1_4)) return JNI_ERR; /* 獲取java中的類 */ cls = (*env)->FindClass(env,"JNIDemo"); if(cls==NULL) return JNI_ERR; /* 函數映射 */ if((*env)->RegisterNatives(env, cls, methods,1)<0) return JNI_ERR; return JNI_VERSION_1_4; }
java代碼:
/* * filename JNIDemo.java * commod: javac JNIDemo.java * */ public class JNIDemo { static { /* 1. load */ System.loadLibrary("native"); /*libnative.so*/ } public native static int hello( int num ); public static void main( String args[] ) { /* 2. java <--> C */ /* 3. call */ System.out.println( hello(123) ); } }
jni中字段描述符:
也可以通過java來生成頭文件從而獲取描述符。
先編譯java程序 javac JNIDemo.java
javah -jni JNIDemo
將會生成 JNIDemo.h:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JNIDemo */ #ifndef _Included_JNIDemo #define _Included_JNIDemo #ifdef __cplusplus extern "C" { #endif /* * Class: JNIDemo * Method: hello * Signature: (I)I */ JNIEXPORT void JNICALL Java_JNIDemo_hello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif