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\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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM