2019独角兽企业重金招聘Python工程师标准>>>

转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899

当我们在调用一个Java native方法的时候,方法中的参数是如何传递给C/C++本地函数中的呢?Java方法中的参数与C/C++函数中的参数,它们之间是怎么转换的呢?我猜你应该也有相关的疑虑吧,咱们先来看一个例子,还是以HelloWorld为例:

HelloWorld.java:

package com.study.jnilearn;class MyClass {}public class HelloWorld {public static native void test(short s, int i, long l, float f, double d, char c, boolean z, byte b, String str, Object obj, MyClass p, int[] arr);public static void main(String[] args) {String obj = "obj";short s = 1;long l = 20;byte b = 127;test(s, 1, l, 1.0f, 10.5, 'A', true, b, "test", obj, new MyClass(), new int[] {});}static {System.loadLibrary("HelloWorld");}
}

在HelloWorld.java中定义了一个test的native方法,该方法中一个共有12个参数,其中前面8个为基本数据类型,后面4个全部为引用类型。

HelloWorld.class生成的头文件内容:

/** Class:     com_study_jnilearn_HelloWorld* Method:    test* Signature: (SIJFDCZBLjava/lang/String;Ljava/lang/Object;)V*/
JNIEXPORT void JNICALL Java_com_study_jnilearn_HelloWorld_test(JNIEnv *, jclass, jshort, jint, jlong, jfloat, jdouble, jchar, jboolean, jbyte, jstring, jobject, jobject);

从头文件函数的原型可以得知,test方法中形参的数据类型自动转换成了JNI中相应的数据类型,不难理解,在调用Java native方法将实参传递给C/C++函数的时候,会自动将java形参的数据类型自动转换成C/C++相应的数据类型,所以我们在写JNI程序的时候,必须要明白它们之间数据类型的对应关系。

在Java语言中数据类型分为基本数据类型和引用类型,其中基本数据类型有8种:byte、char、short、int、long、float、double、boolean,除了基本数据类型外其它都是引用类型:Object、String、数组等。8种基本数据类型分别对应JNI数据类型中的jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean。引用类型在JNI中全部由jobject表示,jobject有很多子类:jstring、jclass、jthrowable、jarray,其中jarray有8个子类,分别对应Java中的8种基本数据类型(jintArray、jshortArray、jlongArray等),由于字符串在开发当中经常用到,所以Java中的String类型在JNI中用jstring表示。下面再回顾头来看看test方法与Java_com_study_jnilearn_HelloWorld_test函数中参数类型的对应关系:

// HelloWorld.java
public static native void test(short s, int i, long l, float f, double d, char c, boolean z, byte b, String str, Object obj, MyClass p);// HelloWorld.h
JNIEXPORT void JNICALL Java_com_study_jnilearn_HelloWorld_test(JNIEnv *, jclass, jshort, jint, jlong, jfloat, jdouble, jchar, jboolean, jbyte, jstring, jobject, jobject, jintArray);

从上面两个函数的参数中可以看出来,除了JNIEnv和jclass这两个参数外,其它参数都是一一对应的。下面是JNI规范文档中描述Java与JNI数据类型的对应关系:

基本数据类型:


引用类型:

注意:

1、JNI如果使用C++语言编写的话,所有引用类型派生自jobject,使用C++的继承结构特性,使用相应的类型。如下所示:

class _jobject {};class _jclass : public _jobject {};class _jstring : public _jobject {};class _jarray : public _jobject {};class _jbooleanArray : public _jarray {};class _jbyteArray : public _jarray {};...

2、JNI如果使用C语言编写的话,所有引用类型使用jobject,其它引用类型使用typedef重新定义,如:typedef jobject jstring

jvalue类型:

jvalue是一个unio(联合)类型,在C语中为了节约内存,会用联合类型变量来存储声明在联合体中的任意类型数据 。在JNI中将基本数据类型与引用类型定义在一个联合类型中,表示用jvalue定义的变量,可以存储任意JNI类型的数据,后面会介绍jvalue在JNI编程当中的应用。原型如下:

typedef union jvalue {jboolean z;jbyte    b;jchar    c;jshort   s;jint     i;jlong    j;jfloat   f;jdouble  d;jobject  l;
} jvalue;

如果对unio类型不太明白的同学,请参考相关资料,在这里不细讲。

转载于:https://my.oschina.net/xyang0917/blog/358802

JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系相关推荐

  1. JNI/NDK开发指南(二)——JVM查找java native方法的规则

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41854185 通过第一篇文章,大家明白了调用native方法之前,首先要调用System. ...

  2. JNI/NDK开发指南(八)——调用构造方法和父类实例方法

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...

  3. JNI/NDK开发指南(十一)——JNI异常处理

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/45770551 异常简介 异常,显而意见就是程序在运行期间没有按照正常的程序逻辑执行,在执行 ...

  4. JNI/NDK入门指南之jobject和jclass

          JNI/NDK入门指南之jobject和jclass Android JNI/NDK入门指南目录 JNI/NDK入门指南之正确姿势了解JNI和NDK JNI/NDK入门指南之JavaVM和 ...

  5. 【我的C语言学习进阶之旅】介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

    目录 一.要介绍本篇博客的原因 二.静态注册 2.1 实现原理 2.2 实现过程 2.3 弊端 2.4 示例 三.动态注册 3.1 实现原理 3.2 实现过程 3.3 优点 3.4 示例 一.要介绍本 ...

  6. Android studio下JNI(NDK)开发

    玩智能手机的都说android手机体验.流畅差苹果太远了,一方面是苹果的硬件确实牛逼,另一个原因在于开发语言上的选择,苹果使用了Objective-C来开发,而android使用了java.程序员都知 ...

  7. Android学Jni/Ndk 开发记录(一)

    治疗拖延症的唯一办法就是:一想起些什么 / 要做些什么就 TM 立马去做! 是的,突然想起我不会 JNI.NDK 开发.解决办法:立马去学! 一:配置 NDK 环境 下载 NDK 写入到配置文件 二: ...

  8. 安卓jni(ndk)开发实战(2)开发jni第一个HellowWorld程序

    一.前言 本文将创建一个 HelloWorld 程序,程序功能很简单,就是一个 jni 方法返回"HelloWorld "字符串,然后界面展示. jni 中涉及动态注册和静态注册, ...

  9. Android Google Map开发指南(三)百度地图、谷歌地图自如切换

    如果你是刚开始接触谷歌地图的话,推荐你先看一下文章: Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题 Android Google Map ...

最新文章

  1. input()与raw_input()
  2. 『实践』Matlab实现Flyod求最短距离及存储最优路径
  3. 世界上第一位程序员,竟然是诗人拜伦的女儿?
  4. cocoscreator3d 获取mesh 大小_Cocos Creator 3D 粒子系统初战: 不要钱的酷炫火焰拿走不谢!...
  5. android 携程日历控件,仿携程酒店日历组件for小程序
  6. hdu 1983(BFS+DFS) 怪盗Kid
  7. 三维偏序:CDQ分治
  8. Java中遍历Map集合的五种方式
  9. 火爆互动小游戏源码接入方法,需要的产品人请查收
  10. 浏览器的同源策略,以及为什么浏览器要用同源策略。
  11. pgm图像修改java_PGM图片格式与代码
  12. nodejs 查看下载文件路径_如何查看知网下载的caj文件
  13. 安装opencv3.4遇到Download: opencv_ffmpeg.dll、ippicv等失败的解决方法
  14. RatingBar基本使用
  15. linux这个名字,Linux 今天 24 岁了,他爸爸最初起的名字却不是这个
  16. kafka的Rebalance问题分析(续)
  17. 谷歌弃用20多年的OKR,再创内卷神器?
  18. 2020华数杯全国大学生数学建模竞赛C题-脱贫帮扶绩效评价体系的构建与探究(二)(附MATLAB和Python代码)
  19. Cadence Allegro PCB中如何导出BOM
  20. 【23家米其林最新收录的香港小食店】原来好吃不贵是真的!

热门文章

  1. swift学习之set和get方法
  2. 非常方便的node内置的调试方法
  3. 盘点2015年数据中心领域十大SDN市场领导者
  4. apue.h头文件(UNIX环境高级编程)
  5. 华为面试题——一道关于指针方面的编程题(C/C++)
  6. 检测你的机子上装了什么版本的.net framework
  7. 重新分区_手机DATA重新分区教程(超详细)
  8. 图像的读取,显示与保存(基于skimage模块)
  9. 数据库系统实现 第六章 查询执行
  10. Android项目中的assets和raw文件夹