JNI和java数据类型转换:

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

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

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

跟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, );
const jchar* jcstr = (env)->GetStringChars(jstrData, 0); // get objectArray elements
jsize dataLength = jenv->GetArrayLength(jstrDatas); // get data length
for (int i=; i<dataLength; i++){
jstring js =(jstring)env->GetObjectArrayElement(jstrDatas, i);
}
// assign string array to objectArray
for (int i=; i<; 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, ); //get data point
jbyte* byteData = jenv->GetByteArrayElements(jbyteData, ); string cStrData = "JNI-test"; if (jstrData)
    (jenv)->ReleaseStringChars(jstrData, jcstr);
if (jstrData)
jenv->ReleaseStringUTFChars(jstrData, strData);
if (jbyteData)
jenv->ReleaseByteArrayElements(jbyteData, byteData, );
if (jfloatData)
jenv->ReleaseFloatArrayElements(jfloatData, floatData, ); return (jint);
}

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

JNI 各类数据类型处理的更多相关文章

  1. JNI之数据类型

    1. JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ; JNIEnv 与 JavaVM : 注意区分这两个概念; -- JavaV ...

  2. Android JNI和NDK学习(06)--JNI的数据类型(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...

  3. Android JNI之数据类型

    JNI中数据类型的意义在于桥接Java数据类型与C数据类型. 简单数据类型: Java Type Native Type Description boolean jboolean unsigned 8 ...

  4. Android NDK开发之Jni的数据类型

    在前面的一篇博客<Android NDK开发简介>,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发.今天我再详细说明一下自己的学习经验. JNI是Java ...

  5. SpringMvc接收multipart/form-data 传输的数据 及 PostMan各类数据类型的区别

    前段时间遇到一个问题,在spring mvc 服务端接收post请求时,通过html 表单提交的时候,服务端能够接收到参数的值.但是使用httpclient4.3构造post请求,却无法接收到参数的值 ...

  6. JNI实战(三):JNI 数据类型映射

    在JNI实战(二):Java 调用 C 我们了解了JNI的静态注册和动态注册.也知道我们应该使用动态注册来进行JNI函数与Java方法之间的映射. 示例的映射表的数组为如下: static JNINa ...

  7. 基于 Android NDK 的学习之旅-----JNI 数据类型

    经典老套流程,学编程语言东西,先学它最基础的数据类型,JNI也是如此.JNI 定义了一系列基本数据类型和引用数据类型与java想对应. 1.基本数据类型 下面一张表是描述了 Java 基本数据类型和J ...

  8. JNI和NDK编程

    Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的一层接口.通过Java JNI,用户可以调用C.C++所编写 ...

  9. JNI/NDK开发指南(开山篇)

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...

随机推荐

  1. HBase权威指南 高清中文版 PDF(来自linuxidc)

      内容提要 <HBase权威指南>由乔治(Lars George)著,探讨了 如何通过使用与HBase高度集成的Hadoop将 HBase的可 伸缩性变得简单:把大型数据集分布到相对廉价 ...

  2. 最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告

    http://www.aqee.net/developer-income-report-14/最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告.数据显示,上月是目前为止他 ...

  3. JS中的转义字符

    http://www.cnblogs.com/wangpei/archive/2009/05/09/1453260.html \b        退格 \t          TAB,水平 \v    ...

  4. C#:加载Excel(待补充)

    string strConn; strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + &qu ...

  5. 和求余运算巧妙结合的jns指令

    .text:004A78B1  and eax, 80000001h.text:004A78B6  jns short loc_4A78BD.text:004A78B8 dec eax.text:00 ...

  6. INFORMIX的dbexport和dbimport使用示例说明

    INFORMIX-IDS数据库进行迁移中,我们在进行数据级别的迁移时,采用dbexport,dbimport来完成.dbexport导出数据库中所有对象的模式脚本和表数据文件,该模式脚本中包含有表等的 ...

  7. QSettings 使用实例 当需要在程序关闭时保存”状态“信息

    用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recent files,等等这些都可以通过Qsettings来实现. 我们知 ...

  8. Genymotion INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

    出现这个错误的原因是Genymotion默认的处理器是x86的,不是arm的.所以安装的时候会出错,仅仅要把x86转换成arm就能够了. 转换方法: 1.下载转换的zip文件:X86 to ARM 2 ...

  9. CA证书的办理

    北京市地方税务局与北京数字证书认证中心(Beijing Certificate Authority ,简称BJCA)合作, 在北京市地方税务局网上纳税及其他网上业务系统中使用BJCA数字证书, 北京数 ...

  10. Struts2源码阅读(一)_Struts2框架流程概述

    1. Struts2架构图  当外部的httpservletrequest到来时 ,初始到了servlet容器(所以虽然Servlet和Action是解耦合的,但是Action依旧能够通过httpse ...