在Android系统启动的时候,会通过AndroidRuntime的startVM开启一个虚拟机,通过Zygote进程fork出app进程,然后采用动态注册的形式会注册android 系统内部的jni函数( Runtime.nativeLoad() )。
    和我们手动调用System.loadLibrary一样,C是怎么调用到Java的,Java又是怎么调用到C的??
    不贴源码进行分析,感兴趣可以根据下面的参考资料一起阅读源码
    来看先大体流程:
    System.loadLibrary() -> JNI_OnLoad()方法(动态注册方法就是在这个方法内实现的) ->
    register_android_media_MediaPlayer(这里就是会记录java和native的映射关系,就和我们动态注册native方法实现一样) -> JNIInvokeInterface 操作
    JavaVM是JNIInvokeInterface类型指针
    5713484-48acac24bc7f78a1.webp

    所以我们理解为java和c之间的关系,会通过一一映射,然后每次Java调用C的时候,都是通过JavaVM和JNIEnv上下文,调用到C的方法,然后C调用Java方法,则是通过JNIEnv拿到实例后,通过反射区调用对应的方法。

    参考资料
    http://gityuan.com/2016/05/28/android-jni/