zoukankan      html  css  js  c++  java
  • 深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)

    JNI的技术特点:

    java能够调用native代码。
    native代码能够调用java代码。
     
    JNI的技术考虑:
    实现java代码的平台无关型。
    java语言发展初期使用C和C++代码,避免重复轮子的需要。
     
     
    举例子说明:
    MediaScanner.java文件
    其中native_init()是native方法,是需要C和C++去实现的,
     
    system.loadLibrary("medua_jni");为加载编译后的so文件。
     
    那么对应java层要实现的代码就是:

    然后看看JNI层的实现:
    JNI层需要讲 java层的“.”转换为“_”
     
    JNI的注册:
    1静态注册:
    MediaScanner.java文件按照这种方式生成的JNI代码就是如下代码:
    静态注册是根据函数名建立java函数和JNI函数之间的关联关系的。
    缺点:
    1    需要通过javah来编译类里面含有native函数的class文件生成对应的jni代码
    2    javah生成的名字过长了。
    3    第一次调用native函数要根据函数名字来所有对应JNI层来建立关联关系。
     
    动态注册:
    JNINativeMedia的结构:

    数据类型转换:
     
    基本数据类型转换:
    引用数据类型转换:
     
    Java代码中中代码:
    对应JNI代码:
    java中的对象:MediaScannerClient对应JNI代码中的Jobject
    仔细看代码出现多余的参数:

    JNIEnv
     
    JNIEnv内部结构图:
    JNIEnv提供了一些JNI系统函数:
    调用java函数;操作jobject对象等很多事情。
     
    JNIEnv具有线程相关型:
    每条线程对应的JNIEnv不能在其他线程中使用。
     
    JNIEnv与JVM之间的关系:

    通过JNIEnv操作jobject
    JNIEnv的成员变量和成员函数
     
    成员变量:jfieldID
    成员函数:jmethodID
    如何获取JNIEnv的成员变量和成员函数呢:

     
    举例子:
     
    如何通过jfield操作jobject?

    jstring
     
    看下例子:
     
    类型标识表:
     
    其实java也提供对应的生成工具方便开发:
     

    垃圾回收:
    JNI中的引用:
     
    对local reference的释放:
    对Global reference的释放:

    JNI异常处理:
     



  • 相关阅读:
    晕,又要学新东西了!
    十一之旅(1)
    结束放假◎!
    容颜总有一天会慢慢老去
    JS里在光标位置插入字符
    放假啦,暂别七天
    好久没来,小小的Happy一下
    唉唉唉
    关于Timer使用,为什么程序会死掉
    于Excel文件上传读取数据的问题
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/33953546236c83cbe49471dffa86c77b.html
Copyright © 2011-2022 走看看