zoukankan      html  css  js  c++  java
  • JNI学习笔记

    JNI是什么-》一套c和java的互掉规则

     

    为什么使用JNI

    1.非常多敏感效率的代码已经用C实现了

    2. JNI双向。java调用c,c调用java

     

    Java集成本地代码问题

    1.代码移植,针对其它的平台须要又一次编译库,.dll,.so

    2.编码复杂了,须要处理掌握C和c++

     

    1.JNI处理异常,不同于Java中的try...catch。在JNI中,发生异常,不会改变代码运行轨迹,所以,当返回NULL,要及时返回,或立即处理异常。

    2.Java层的field和method,无论它是Public,还是package,private和protected,从JNI都能够訪问到。Java面向语言的封装性不见了。

    3.调用Java须要获取field与method IDs,须要做基于名称和签名的符号表查询,此过程能够被优化。思路:仅仅在第一次使用ID时查询,然后缓存改值,有两个缓存时机:首次使用和初始化类时。

    4.Java层对象作为opaque references传递到JNI层。是由于不希望JNI用户了解JNI内部数据结构.

    5. signature:"(ILjava/lang/String;[I)J"

    签名是一种用參数个数和类型区分同名方法的手段。即解决方法重载问题。

    6. JNI支持三种类型的opaque reference: local references,global references和weak global references,local 和Global引用有不同的生命周期。Local Ref在nativemethod 运行完成后被JavaVm自己主动释放,而Global须要手动释放。

      6.1大部分JNI函数都会创建LocalRef,如NewObject创建一个实例,并返回一个指向该实例。

    LocalRef仅仅在本线程的native method中有效.一旦native method 返回,localRef将被释放。

    不要缓存一个LocalRef,并企图在下次进入该JNI方法时使用

     

    7.Android 调用JNI流程

      1.编写XXX.java,里面包括System.loadLibrary()和Nativemethod的声明。

     2.javah XXX.java生成 .h文件

     3.编写.cpp实现.h中声明的方法

     4.将.cpp编译成.so

     

    8. .so仅仅会在运行时载入。不參与编译。


  • 相关阅读:
    我用微笑剪辑我的微电影 ---六月实习总结
    【Espruino】NO.17 使用平板电脑调试Espruino(OTG方式)
    级联下拉列表
    GG中obey命令的使用
    Android Studio 怎样打开两个项目?
    解决在sdk manager中更新文件后出现This Android SDK requires Android Developer Toolkit version 23.1的错误
    UVA1492
    Codeforces Round #256 (Div. 2)A-D
    C++ bool和string转换
    云计算设计模式(十六)——优先级队列模式
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10705571.html
Copyright © 2011-2022 走看看