Android中JNI的理解

一、JNI是什么及其存在的意义?

二、JNI如何使用?

三、JNI运行的原理。

Java----JNI----Native

JNI就像一座桥梁,联通java与本地调用
Java程序员,需要做两件事,一是加载动态库,System.loadLibrary()。二是声明由native关键字修饰的函数。

在JNI层:
       JNIEnv是什么?  
  JNIEnv是一个与线程相关的代表JNI环境的结构体。JNIEnv结构体里放的是JNI内部系统函数的指针。通过这些函数可以1、调用Java函数。2、操作jobject对象等。
        调用JavaVM的AttachCurrentThread函数可以得到这个线程的JNIEnv结构,DetachCurrentThread释放相应资源。
  
  如何通过JNIEnv操作jobject?
       本质是去操作这些对象的成员变量和成员函数。在JNI规则中,用jfieldID和jmethodID来表示Java类的成员变量和成员函数。可以用JNIEnv的两个函数得到:
        jfieldID  GetFieldID( jclass clazz, const char *name, const char *sig );
        jmethodID GetMethodID( jclass clazz, const char *name, const char *sig );
jclass代表java类,name代表成员函数或成员变量的名字,sig是这个函数和变量的签名信息。
通过JNIEnv中的CallVoidMethod函数,将jfieldIDh和jmethodID传入函数中即可以调用java中的函数。调用java中的static函数需要CallStatic<Type>Method系列函数。
  
  JavaVM是什么?
      它是虚拟机在JNI层的代表,全进程只有一个JavaVM对象,所以可以保存,并且在任何地方使用都没有问题。

  基本数据类型与引用数据类型在JNI层的表示与含义?
      基本数据类型前加了个j所占字节不变。要注意的是java中的char是16位的本地语言一般都是8位,转换过的jchar类型也是16位的。
  引用数据类型除了java中基本类型的数组,Class、String和Throwable外,所有java对象的数据类型在JNI中都用jobject表示。jintArray等、jclass、jstring、jthrowable。
  
  jobject如何使用呢?
      在JNI层中的函数会比java层的函数增加两个参数,一个是 JNIEnv* 一个是jobject它表示是调用了哪个对象的函数。如果调用的是静态函数则是jclass,表明时哪个类。get<type>Field系列函数获取jobject对应的成员变量的值。set<type>Field设置成员变量的值。
  
  JNI函数的注册,它如何与java中native修饰的函数关联起来的?
      静态注册,工具程序javah,1、先编写Java代码,然后编译生成.class文件。2、javah用packagename.clasename生成对应头文件。初次调用native函数需要根据函数名字搜索对应的JNI层函数建立关联关系。其实就是保持JNI层的函数指针,以后可以用函数指针直接调用。
      动态注册,JNINativeMethod结构用来记录这种一一对应关系  “函数名”,“函数签名”,“函数指针”。system.loadLibrary加载完动态库后会马上查找库中是否有JNI_OnLoad()函数,如果有救执行它。只有在它里面完成动态注册的动作。
  
  函数签名是什么意思?
           因为java支持函数重载,JNI将参数类型和返回值类型的组合作为了一个函数的签名信息,有了签名信息和函数名就能很顺利的找到java中的函数了。{参数1类型标示参数2类型标示...}返回值类型标示    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值