JNI 接口<一>

在android 中 ,顶层应用程序使用java语言,通过Dex 编译成bytecode时,就需要jvm来执行,如果java需要与本地模块交互时,vm 就会加载JNI本地模块,然后让java顺利的调用jni模块,
在android中,JNI是融合java和C/C++的关键技术
如何加载 System.loadLibrary(“*.so”);

首先去执行C模块里的JNI_onload();进行初始化设定,然后通过JNI_onUnload();释放。

   static void android_media_MediaPlayer_prepare(JNIEnv *env){ 

    .......
  } 
    static void android_media_MediaPlayer_setDataSource(JNIEnv *env,jobject obj){ 

    .......
  } 
     jint JNI_OnLoad(JavaVM* vm, void* reserved) {    

         JNIEnv* env = NULL;     jint result = -1; 
          if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {    
                                        LOGE("ERROR: GetEnv failed\n");        
          }     assert(env != NULL);    
         LOGE("ERROR: native registration failed\n");    
          goto bail; 
          } if (register_android_media_MediaRecorder(env) < 0) {    

           goto bail;   

         } if (register_android_media_MediaMetadataRetriever(env) < 0) {  
           LOGE("ERROR: native registration failed\n");      
                     goto bail;   
         }   
            result = JNI_VERSION_1_4; bail:  

            return result; 
    } // 

为了执行时提高效率,通常并且就是按以下方式进行,然后循环查找,将此gMethods[]中的内容注册到VM中;

  static int register_android_media_MediaPlayer(JNIEnv *env){ 

   return AndroidRuntime::registerNativeMethods(env,     
         "android/media/MediaPlayer", gMethods, NELEM(gMethods)); 
  } 

  static JNINativeMethod gMethods[] = {    
    ..........
     {"setDataSource","(Ljava/lang/String;)V", (void *)android_media_MediaPlayer_setDataSource},  
     {"setDataSource",  "(Ljava/io/FileDescriptor;JJ)V",(void *)android_media_MediaPlayer_setDataSourceFD}, 
     {"prepare",   "()V",(void *)android_media_MediaPlayer_prepare},      
     {"prepareAsync",   "()V",   (void *)android_media_MediaPlayer_prepareAsync}, 
     {"_start",   "()V",   (void *)android_media_MediaPlayer_start},  
     {"_stop",   "()V",    (void *)android_media_MediaPlayer_stop},   
     {"getVideoWidth",   "()I",      (void *)android_media_MediaPlayer_getVideoWidth},   
     {"getVideoHeight",   "()I",      (void *)android_media_MediaPlayer_getVideoHeight} ,
     {"native_setup",    "(Ljava/lang/Object;)V",(void *)android_media_MediaPlayer_native_setup}, 
     {"native_finalize",     "()V",    (void *)android_media_MediaPlayer_native_finalize},
      ..........
    };       



由于VM是多线程环境,所以JNIEnv* env用来标识,避免数据冲突

 jstring  jd(  JNIEnv* env){
    return  env->NewStringUTF("");
}

调用过程中类型对应表如下
这里写图片描述

关于apk

apk是android 安装的套装程序,在android中是一种MIME为zip的压缩包,在windows中将后缀名修改成zip,就可以看到目录结构,因此可以加入自己的东西,比如说.so 放置到libs/交叉编译版本/.so下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值