[Android] JNI技术

为什么要引入JNI技术?

概念:JNI是Java native interface的缩写,Java本地调用,JNI是一种技术;
1.Java程序中可以调用native语言(C/C++)写和函数;
2.native程序中的函数可以调用Java层的函数,也就是说,C/C++程序中可以调用Java的函数;

JNI的运用

JNI层必须实现为动态库的形式,这样Java虚拟机才能加载并调用它的函数,命名方式采用“lib模块名_jni.so”
JNI技术使用的步骤:
1.加载对应的JNI库(System.loadLibrary());
2.声明由关键字native修饰的函数;
JNI函数注册的方法
概念:JNI函数的注册问题就是将Java层的native函数和JNI对应的实现函数关联起来;
1.静态方法
问题:静态方法中native函数是如何找到对应的JNI函数的?
当Java层调用native_int函数是,它会从对应的JNI库中寻找java_android_media_MediaScanner_native_init函数,
如果没有就会报错,如果找到,则会为这个native_init和java_android_media_MediaScanner_native_init建立一个
关联关系,其实就是保存JNI层函数的指针,以后再调用native_init时,直接使用这个函数指针就可以了。
2.动态方法
使用一个JNINativeMethod的结构体来记录Java层native函数和JNI函数是一一对应的。
AndroidRunTime类提供了一个registerNativeMethods函数来完成注册工作。
这些动态注册函数在Java层通过System.loadLibrary()加载完JNI动态库后,紧接着会查找该库中的
一个叫做JNI_OnLoad的函数,如果有就调用它,动态注册的工作就是在这里完成的。
数据类型转换(Java数据类型–JNI数据类型)
Java数据类型分为基本数据类型和引用数据类型;
参数签名
概念:参数签名由参数加返回值组成,参数必须用小括号括起来,没有参数时也要使用一对空括号。
例如,“(I)V”表示方法由一个整型参数,无放回值;“([IZ)I”表示方法由两个参数,第一个
是整型数组,第二个是布尔型,返回类型为整型。
复杂类型的参数签名格式是‘L’加上“全限定类名”再加上‘;’如:
string类的参数签名是“L/java/lang/String”,对应的JNI类型为jstring,其余Java复杂类型对应的是
JNI类型都是jobject。

为什么需要参数签名?

因为Java支持函数重载,因此,可以定义同名但是不同参数的函数,但是,仅仅通过函数名是没有办法
找到具体函数的。为了解决,JNI技术中就将参数类型和返回值类型的组合作为一个函数的签名信息,
有了签名信息和函数名,就能很顺利找到Java中的函数。

JNIEnv介绍

JNIEnv是一个与线程相关的代表JNI环境的结构体
JNIEnv实际上就是提供了一些JNI系统函数,通过这些函数可以调用Java的函数,操作object对象很多事情。
通过JNIEnv操作jobject和jstring
从C/C++到Java的调用(回调)
1.生成Java对象,可以使用函数NewObject();
2.调用Java类的方法,例如,方法的返回值是int型,则需要调用函数callIntMethod()。
3.存取Java类的域变量(得到、设置非静态域变量;得到、设置静态域变量)

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值