zoukankan      html  css  js  c++  java
  • JNI 各类数据类型处理

    JNI和java数据类型转换:

    1、基本数据类型
    下面一张表是描述了 Java 基本数据类型和JNI中基本数据类型的相对应关系已经占用空间大小。

    JNI 数据类型转换 - hero_213 - hero_213的博客

    随便观察就能发现,其实就基本数据类型而已,JNI基本数据类型只是比Java基本数据类型前多了个’j’而已
    当然,JNI中还有个Java中没有的jsize,定义如下:
    typedef jint jsize;
    其实jsize整型是用来描述基本指标和大小,没有什么神秘的。

    2、引用数据类型
    JNI 引用类型 与 Java 的对应关系 如下 树层次图:

    JNI 数据类型转换 - hero_213 - hero_213的博客

     
    跟java一样,jobject 是所有引用类型的 父亲。看看是不是很容易理解 ?呵呵.关于jthrowable,JNI也是有线程概念的.

    3、        The jvalue Type
    Jvalue 是基本数据类型和引用数据类型的集合,它的定义如下:
    typedef union jvalue {
        jboolean z;
        jbyte    b;
        jchar    c;
        jshort   s;
        jint     i;
        jlong    j;
        jfloat   f;
        jdouble  d;
        jobject  l;
    } jvalue;

    Java类型和本地类型对应  
      在如下情况下,需要在本地方法中应用java对象的引用,就会用到类型之间的转换:
      1)java方法里面将参数传入本地方法;
      2)在本地方法里面创建java对象;
      3)在本地方法里面return结果给java程序。
      分为如下两种情况:
      Java原始类型
      像booleans、integers、floats等从Java程序中传到本地方法中的原始类型可以直接使用,下面是java中的原始类型和本地方法中的类型的对应:
      Java类型  本地类型  字节(bit)
      boolean   jboolean   8, unsigned
      byte    jbyte    8
      char    jchar    16, unsigned
      short    jshort    16
      int     jint     32
      long    jlong    64
      float    jfloat    32
      double   jdouble   64
      void    void     n/a
      也就是说如果我在方法中传进去了一个boolean的参数的话,那么我在本地方法中就有jboolean类型与之对应。同理,如果在本地方法中return一个jint的话,那么在java中就返回一个int类型。

      下面是访问String的一些方法:
      ◆GetStringUTFChars将jstring转换成为UTF-8格式的char*
      ◆GetStringChars将jstring转换成为Unicode格式的char*
      ◆ReleaseStringUTFChars释放指向UTF-8格式的char*的指针
      ◆ReleaseStringChars释放指向Unicode格式的char*的指针
      ◆NewStringUTF创建一个UTF-8格式的String对象
      ◆NewString创建一个Unicode格式的String对象
      ◆GetStringUTFLengt获取UTF-8格式的char*的长度 
      ◆GetStringLength获取Unicode格式的char*的长度

    JNIEXPORT jint JNICALL Java_com_test_funcName(JNIEnv *jenv, jclass jcls,
        jstring jstrData,
        jobjectArray jstrDatas,
        jfloatArray jfloatData,
        jbyteArray jbyteData
    ){
        int strLength = (jenv)->GetStringLength(jstrData);
        const char* strData = jenv->GetStringUTFChars(jstrData, 0);
    const jchar* jcstr = (env)->GetStringChars(jstrData, 0);
    // get objectArray elements jsize dataLength = jenv->GetArrayLength(jstrDatas); // get data length for (int i=0; i<dataLength; i++){ jstring js =(jstring)env->GetObjectArrayElement(jstrDatas, i); } // assign string array to objectArray for (int i=0; i<10; i++){ jstring jstrElement = jenv->NewStringUTF(cStrData.c_str()); jenv->SetObjectArrayElement(jstrDatas, i, jstrElement); jenv->DeleteLocalRef(jstrElement); } // or assign string array to objectArray // jclass jstrCls =env->FindClass("Ljava/lang/String;"); // jstrDatas = (jobjectArray)jenv->NewObjectArray( // 5, //num elements // jstrCls, // java str class // env->NewStringUTF(cStrData.c_str()) // init data, or set NULL // ); jfloat* floatData = jenv->GetFloatArrayElements(jfloatData, 0); //get data point jbyte* byteData = jenv->GetByteArrayElements(jbyteData, 0); string cStrData = "JNI-test"; if (jstrData)
        (jenv)->ReleaseStringChars(jstrData, jcstr);
    if (jstrData) jenv->ReleaseStringUTFChars(jstrData, strData); if (jbyteData) jenv->ReleaseByteArrayElements(jbyteData, byteData, 0); if (jfloatData) jenv->ReleaseFloatArrayElements(jfloatData, floatData, 0); return (jint)0; }

    参考:http://blog.163.com/hero_213/blog/static/398912142012011325273/

  • 相关阅读:
    文件的基本操作整理
    简谈深浅拷贝
    python进阶之内置方法
    python基础之打/解包及运算符与控制流程
    python中的常用数据类型
    python基础学习(起步)
    趣谈编程语言 (续集)
    豆瓣王守崑:大数据时代社交图谱与兴趣图谱的融合
    常见面试之机器学习算法思想简单梳理
    Future Research Directions in Social Recommendation
  • 原文地址:https://www.cnblogs.com/hansjorn/p/8574178.html
Copyright © 2011-2022 走看看