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属于不同线程,存在回调问题.

猜你喜欢

转载自blog.csdn.net/yaonga/article/details/73920829
今日推荐