JNI

 

  JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。


一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:
a、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。
b、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个当中。这样就降低了JAVA和C之间的耦合性
1、Android JNI的背景
Android的架构图如下:
JNI

  Application和Framework层使用的是java语言,librarieskenel层使用的是C++&C语言

  Android的底层,已经有了一个C &C++成的库或程序,而你希望在java程序中使用,就要用到JNI


2、JavaC/C++如何互通的

     其实不能互通的原因主要是数据类型的问题,jni解决了这个问题。

例如:C文件中的jstring数据类型就是java传入的String对象,经过jni函数GetStringUTFChars()的转化就能成为c的 char*。

         

2.1  基本数据类型
  JNI

2.2 引用类型

JNI

3、底层的C、C++如何调用到Java? 

       在C/C++层为了获取Java层的对象、变量以及描述Java的方法,需要用字符串来描述需要获取对象的类名变量类型以及方法

3、1 类描述符

   JNI

   规则就是将"com.xm.jni.MainActivity"中的“.”用“/”代替。

   其中com.xm.jni是包名, MainActivity是对应的类名


3.2 数据类型描述符

   JNIJNI

  应用类型的数据描述符。对于引用类型描述符是"L"开头";"结尾

   JNI

    JNI 

3.3 方法描述符

 JNI      JNI

   方法描述符,可以通过命令获取到  javap –s packageName.className 

   例如:javap -scom.xm.jni.MainActivity

JNI

   

附件:对应的源码例子

相关文章:

  • 2021-07-07
  • 2021-12-20
  • 2021-12-12
  • 2021-09-20
  • 2021-09-25
  • 2021-10-02
  • 2022-01-26
猜你喜欢
  • 2021-09-29
  • 2021-04-12
  • 2022-01-10
相关资源
相似解决方案