本博客内容来自《深入理解android卷一》

android分为三层:java层,JNI层,Native层

这里以MediaScanner为例:

java层:

public class MediaScanner{      staic{            System.loadLibrary("media_jni");            native_init();//调用native_init函数      }     ...     public void scanDirectories(String[] directories,String volumnName){     ......     }     //申明一个native函数。native为java的关键字,表示它将由jni层完成     private static native final void native_init();     private native void processFile(String path,String mimeType,MediaScannerClient client);}

JNI层:

代码位置:android_media_MediaScanner.cpp

static void android_media_MediaScanner_native_init(JNIEnv *env){    jclass clazz;   clazz = env->FindClass("android/media/MediaScanner");//java层文件代码路径    ...   fields.context = env->GetFieldID(clazz,"mNativeContext","I");   ...   return;}//这个函数是processsFile的JNI层实现static void android_media_MediaScanner_processFile(JNIEnv *env,jobject thiz,jstring path,jstring mimetype,jobject client){MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz,fields.contenxt);...const char *pathStr = env->GetStringUTFChars(path,NULL);...if(mimeType){   env->ReleaseStringUTFChars(mimeType,mimeTypeStr);}}

问题:native_init();层如何知道android_media_MediaScanner_native_init的位置

android.media.MediaScanner.native_init换算成android_media_MediaScanner_native_init

答:一共有两种方式注册

1、静态方法

先编写JAVA代码,然后编译生成.class文件

使用javah -o output packagename.classname生成的output.h文件中,就申明了JNI函数

2、动态注册

在libmedia_jni.so实现JNI_OnLoad

jclass clazz = (*env)->FindcClass(env,className);

(*env)->RegisterNatives(env,clazz,gMethods,numMethods);

jint JNI_OnLoad(JavaVm *vm,void * reserved)

{

JNI

}

更多相关文章

  1. Android(安卓)NDK开发之旅29--C++--list、set、map用法
  2. android 文件下载到SD卡中
  3. Android打包剔除指定权限
  4. java android 删除文件和文件夹的函数
  5. Android(安卓)实现GIF播放(解码)
  6. 安装Android(安卓)SDK
  7. Android中Log机制
  8. Android设计开发要必用的Color.xml文件整理
  9. ubuntu android 环境变量的配置

随机推荐

  1. Android状态栏合集-管你透不透明
  2. android ContentResolver详解
  3. Android用户界面开发:Fragment
  4. android进程间通讯(1)--Bundle和文件共享
  5. python 几种android截屏方式的学习与使用
  6. Android最佳实践之性能 - 电池续航时间优
  7. Android基础总结七:SeekBar的使用
  8. Android(安卓)自定义数字键盘(二)随机数字
  9. mac os x android环境变量设置
  10. Android系统开发一