JNI是Android系统中Java与Native交互的桥梁
MediaRecorder举例
- java:MediaRecorder.java
- JNI:动态库libmedia_jni.so
- Native:动态库libmedia.so (实际功能)
java层MediaRecorder
1 | //frameworks/base/media/java/android/media/MediaRecorder.java |
JNI层的MediaRecorder
1 | //frameworks/base/media/jni/android_media_MediaRecorder.cpp |
native_init如何找到对应的android_media_MediaRecorder_native_init ?
JNI注册
静态注册
静态注册就是根据方法名,将Java方法和JNI方法建立关联,但是它有一些缺点:
- JNI层的方法名称过长。
- 声明Native方法的类需要用javah生成头文件。
- 初次调用JIN方法时需要建立关联,影响效率。
动态注册
JNI中的JNINativeMethod,用来关联Java中的Native方法和JNI中的方法,它在jni.h中被定义:
1 | typedef struct { |
系统的MediaRecorder采用的就是动态注册,定义数组,然后注册
1 | //frameworks/base/media/jni/android_media_MediaRecorder.cpp |
最终调用JNIEnv的RegisterNatives
从注释//JNI_OnLoad in android_media_MediaPlayer.cpp
可以看到register_android_media_MediaRecorder
的调用点
1 | //frameworks/base/media/jni/android_media_MediaPlayer.cpp |
参考:
http://liuwangshu.cn/tags/Android%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3JNI/