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#include /* /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 JNICALLJNI_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/* Header for class JNIDemo */#ifndef _Included_JNIDemo#define _Included_JNIDemo#ifdef __cplusplusextern "C" {#endif/* * Class: JNIDemo * Method: hello * Signature: (I)I */JNIEXPORT void JNICALL Java_JNIDemo_hello (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif