JNI

来源:互联网 发布:大数据时代的思维变革 编辑:程序博客网 时间:2024/05/17 00:01

 

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


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

  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  基本数据类型
  

2.2 引用类型

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

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

3、1 类描述符

   

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

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


3.2 数据类型描述符

   

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

   

     

3.3 方法描述符

       

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

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


   

附件:对应的源码例子

原创粉丝点击