• 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
  • 相关阅读:
    共享onload事件
    如何让背景图片平铺满整个浏览器页面
    Jmeter-配置环境资源池(如何设置HTTP请求默认值)
    Navicat 15下载教程
    Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程)
    Dynamics CRM记录页面上隐藏子网格“+”标识
    Dynamics CRM 开发模板使用手册(插件开发)
    Dynamics CRM 常用 C# 方法集合
    Microsoft Dynamics CRM 2016 增强版的解决方案(CRM新特性,开发者的福利)
    Dynamics CRM 2016 使用Plug-in Trace Log调试插件
  • 原文地址:https://www.cnblogs.com/ynxf/p/6897462.html
Copyright © 2020-2023  润新知