android调用jni

1.概述:JNI(Java Native Interface,Java本地接口),用于打通Java层与Native(C/C++)层.
2.系统调用jni:
过程:app启动–>Kernel创建init进程–>init进程fork出Zygote进程–>Zygote进程在AndroidRuntime.cpp中创建javaVM(一个app进程对应一个虚拟机实例)实例–>虚拟机注册系统JNI方法
注:javaVM:
通常在VM加载*.so程序库时,
会先调用JNI_OnLoad()函数,在JNI_OnLoad()函数中会将JavaVM指针对象保存到c层JNI的全局变量中.JavaVM对象是所有线程共享的.
javaENV:
JNIEnv对象,当Java线程调用到C层的JNI函数的时候.一定会进入VM,VM会产生一个相应的JNIEnv对象.这JNIEnv对象和线程是一一对应的关系.在调用JNIEnv中的函数时.多个线程调用的JNIEnv中的本地函数都是独立的.因为VM会为每个线程产生一个JNIEnv对象实体.
3.程序自己定义的jni方法调用:

public class MediaPlayer{
    static {
        System.loadLibrary("media_jni");
        native_init();
    }

    private static native final void native_init();
    ...
}

通过static静态代码块中System.loadLibrary方法来加载动态库,库名为media_jni, Android平台则会自动扩展成所对应的libmedia_jni.so库.接着通过关键字native加在native_init方法之前,便可以在java层直接使用native层方法.
4.andorid调用jni存在同步调用和异步调用:
同步调用:android调用线程和jni属于同一线程,不存在回调问题.
异步调用:android调用线程(设置回调接口)和jni属于不同线程,存在回调问题.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值