zoukankan      html  css  js  c++  java
  • 【Android开发】NDK开发(2)-jni数据类型

    一、      Java数据类型与jni数据类型对应关系

    基本数据类型

    一维数组

    Java类型

    jni类型

    Java类型

    jni类型

    void

    void

     

     

    boolean

    jboolean

    boolean[]

    jbooleanArray

    byte

    jbyte

    byte[]

    jbyteArray

    char

    jchar

    char[]

    jcharArray

    short

    jshort

    short[]

    jshortArray

    int

    jint

    int[]

    jintArray

    long

    jlong

    long[]

    jlongArray

    float

    jfloat

    float[]

    jfloatArray

    double

    jdouble

    double[]

    jdoubleArray

     

     

     

     

    对象

    二维数组

    Java类型

    jni类型

    Java类型

    jni类型

    Object

    jobject

    boolean[]

    jobjectArray

    Class

    jclass

    byte[]

    String

    jstring

    char[]

     

    short[]

    int[]

    long[]

    float[]

    double[]

     

    二、      jni数据类型的使用:

    a)       基本数据类型

    这个没有什么好说的,用法跟C中基本数据类型一致。

    b)      一维数组

    在jni.h头文件中,可以看到声明一维数组的代码:

     1 jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);
     2 
     3 jbyteArray    (*NewByteArray)(JNIEnv*, jsize);
     4 
     5 jcharArray    (*NewCharArray)(JNIEnv*, jsize);
     6 
     7 jshortArray   (*NewShortArray)(JNIEnv*, jsize);
     8 
     9 jintArray     (*NewIntArray)(JNIEnv*, jsize);
    10 
    11 jlongArray    (*NewLongArray)(JNIEnv*, jsize);
    12 
    13 jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);
    14 
    15 jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize);

    参数jsize 在jni.h头文件中可见宏定义:

    1 typedef jint            jsize;

    其含义是数组大小。

    对一维数组赋值的方法,以jcharArray数组为例:

    1 void        (*SetCharArrayRegion)(JNIEnv*, jcharArray,
    2 
    3                         jsize, jsize, const jchar*);

    参数:

         jcharArray:你声明的jcharArray变量

         jsize(第一个):给jcharArray变量赋值的起点

         jsize(第二个):给jcharArray变量赋值的范围

         jchar *:给jcharArray变量赋值内容jchar[]

    具体使用以jcharArray为例:

    1 char charr[] = "fuckJni";
    2 
    3 jchar *jarray = (*env)->NewCharArray(env, 10);
    4 
    5  (*env)->SetCharArrayRegion(env, jarray, 0, 10, charr);

    c)       二维数组

    所有的二维数组类型均为jobjectArray,在jni.h中,其声明方法为:

    1 jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);

    参数:

         jsize:多少个一维数组组成,如果二维数组表示成a[m][n]的话,jsize就是m的值

         jcalss:数组元素类型,int?或char?

         Jobject:可赋为NULL

    其中第三个参数,jclass是一种对象,其声明如下:

    1 jclass intArrCls = (*env)->FindClass(env, "[B"];

    其中第二个参数”[B”,‘[’表示数组,‘B’表示byte类型。对于其他类型有如下对应关系:

    boolean

    Z

    byte

    B

    char

    C

    short

    S

    int

    I

    long

    J

    float

    F

    double

    D

    string

    Ljava/lang/String

     

     

      具体使用以二维byte数组为例:

     1 jclass intArrCls = (*env)->FindClass(env, "[B"];
     2 
     3 jobjectArray rtu = (*env)->NewObjectArray(env, 32, intArrCls, NULL);
     4 
     5 jbyte a[3][4] = {{1,2,3,4}, {5,6,7,8},{9,10,11,12}};
     6 
     7 i = 0;
     8 
     9 for(; i < 3; i++){
    10 
    11    jbyteArray bArray = (*env)->NewByteArray(env, 4);
    12 
    13    (*env)->SetByteArrayRegion(env, bArray, 0, 4, a[i]);
    14 
    15    (*env)->SetObjectArrayElement(env, rtu, i, bArray);
    16 
    17    (*env)->DeleteLocalRef(env, bArray);
    18 
    19    }

    d)      对于jstring类型,使用如下:

    1 jstring str = (*env)->NewStringUTF(env, "Fuck Jni!");

    2014-03-16 

  • 相关阅读:
    java 读取配置文件
    oracle sql 截取表中某一字段的部分作为该字段查询结果
    大数据课堂
    网站保存
    Tensorflow+Keras 深度学习人工智能实践应用 Chapter Two 深度学习原理
    Tensorflow+Keras 深度学习人工智能实践应用 Chapter One人工智能 机器学习与深度学习简介
    Python 机器学习及实践 Coding 无监督学习经典模型 数据聚类 and 特征降维
    博客地址的保存
    备注
    个人笔记-
  • 原文地址:https://www.cnblogs.com/youthpasses/p/3844998.html
Copyright © 2011-2022 走看看