zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【模式分解】无损连接&保持函数依赖
    【范式与函数依赖】3NF与BCNF的区别
    C#设置按钮三态背景图片
    C#代码设置窗体和Panel的位置大小
    C#窗体嵌套
    C#中弹出新窗口
    C#定义委托函数实现在别的窗体中操作主窗体中的SerialPort控件
    C#界面设计疑问2:panel摆放问题
    C#拖动自己的定义标题栏(panel)以及实现窗体拖动关闭和最小化
    C#界面设计疑问
  • 原文地址:https://www.cnblogs.com/ynxf/p/6897462.html
Copyright © 2011-2022 走看看