JAVA程序通过JNI调用C/C++库

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
",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
原文地址:https://www.cnblogs.com/ynxf/p/6897462.html