JNI

 

  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


   

附件:对应的源码例子

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值