HardBirch

JNI学习之步步深入二

时间:11-05-23 栏目:安卓学习笔记 作者:张飞不张,文采横飞 评论:9 点击: 3,987 次

JNI为了扮演在c/c++和java之间的匹配工作,它首先需要做的就是既要认识java中的数据类型,也要认识c/c++中的数据类型。这时,jni就相当于一个适配者了。好比,A与C两个人本来不认识,可是现在B认识A,B也认识C,那么通过C的指引和介绍,A和C就认识了!

 

那么jni如何做到既认识C/C++,也认识java呢?其实很简单,一张匹配表足矣,见图!

 

 

1、原始数据类型的匹配:

gg

其中jni中的本地类型都是以j开头,可以在c/c++中直接和c/C++类型互通互换!

 

2、复杂数据类型的匹配:

gg2

几种复合数据类型,主要是字符串jstring和数组jarray。注意jni中复合数据类型不能直接转换为c/C++中相应的类型,需要调用jni中自带的相应的方法来操作!

 

3、同时,JNI中还包含了一组描述符,包含类描述符、域描述符和方法描述符。

 

3.1 类描述符

类描述符是类的完整名称(包名+类名),将原来的.分隔符换成/分隔符。比如在java代码中的java.lang.String类的类描述符就是java/lang/String。

    对于数组,其描述符是[+该类型的域描述符。比如int[] 其描述符为[I;float[] 其描述符为[F;String[]其描述符为[Ljava/lang/String;对于int[][] 其描述符为[[I;以此类推。。。

 

3.2 域描述符

域描述符,分为原始数据类型的域描述符,和引用类型的域描述符。原始数据类型的域描述符如下图:

 

gg3

 

注意哦,仔细看看long类型的域描述符(J);

 

对于引用类型的域描述符,其以L开始,以;结束。对于数组,其为[+其类型的域描述符+;

比如:String类型的域描述符为Ljava/lang/String;int[]类型的域描述符为[I;Object[]类型的域描述符为[Ljava/lang/Object;

 

3.3 方法描述符

方法描述符,将参数类型的域描述符按照申明顺序放入一对括号中后跟返回值类型的域描述符。对于,没有返回值的,用V表示。看下面一组例子:

 

String test(); ----------------------------->()Ljava/lang/String;

int f(int i, Object j);---------------------->(ILjava/lang/Object;)I

set(byte[] bs);---------------------------->([B)V

 

 

 

 

 

 

 

 

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: JNI学习之步步深入二

JNI学习之步步深入二:目前有9 条留言

  1. 9楼
    king2101:

    [e01]

    2011-05-25 09:06 [回复]
  2. 8楼
    jeanthbian:

    [e01]

    2011-05-25 10:10 [回复]
  3. 7楼
    maocoffee:

    学习了[e03]

    2011-05-25 16:20 [回复]
  4. 如果不是用在Android上,你可以用JNA,会更简单一点。

    2011-05-25 21:57 [回复]
  5. 5楼
    Sky_Monkey:

    恩 来看了 建议楼主建个群 一起即时讨论下

    2011-05-26 09:52 [回复]
  6. 4楼
    fgakjfd:

    [e03]

    2011-05-30 10:59 [回复]
  7. 地板
    yuyantai1234:

    [e01][e01][e04]

    2011-05-30 16:49 [回复]
  8. 学习LZ

    2011-06-02 18:06 [回复]
  9. 沙发
    qinjuning:

    写的很好 。 不过对于数组,其为[+其类型的域描述符 (其类型的域描述符如果为引用类型的话,已经加上了 ; 了)

    2012-05-21 19:35 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐