JNI之------JNINativeMethod

来源:互联网 发布:大学网络教育专业 编辑:程序博客网 时间:2024/06/05 18:09

文章出处:http://blog.csdn.net/shift_wwx


前言:之前的一篇(Android基础总结之九:JNI详解)是结合实例的简单总结,这边总结一下JNINativeMethod。


1、JNINativeMethod 结构体的官方定义

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. typedef struct {    
  2.     const char* name;    
  3.     const char* signature;    
  4.     void* fnPtr;    
  5. } JNINativeMethod;  
第一个变量name是Java中函数的名字。

第二个变量signature,用字符串是描述了Java中函数的参数和返回值

第三个变量fnPtr是函数指针,指向native函数。前面都要接 (void *)

第一个变量与第三个变量是对应的,一个是java层方法名,对应着第三个参数的native方法名字

示例:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. static JNINativeMethod methods[] = {    
  2.   { "printJNI""()I",        (void*)printForTest},    
  3.       
  4. };   

主要是第二个参数比较复杂:

括号里面表示参数的类型,括号后面表示返回值。

"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Fun();

"(II)V" 表示 void Fun(int a, int b);


2、第二个参数之基本类型



3、第二个参数之对象类型和数组类型


对象类型:以"L"开头,以";"结尾,中间用"/"隔开。如表第一行。

数组类型:以"["开头,如表第二行(n维数组的话,则前面就n个"[",如"[[[D"就表示double[ ][ ][ ])。

对象数组类型:就是上述两者结合,如表第三行。


4、举例



5、结合Media中的看看

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. static JNINativeMethod gMethods[] = {  
  2.     {  
  3.         "_setDataSource",  
  4.         "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V",  
  5.         (void *)android_media_MediaPlayer_setDataSourceAndHeaders  
  6.     },  
  7.   
  8.     {"_setDataSource",       "(Ljava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer_setDataSourceFD},  
  9.     {"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer_setVideoSurface},  
  10.     {"prepare",             "()V",                              (void *)android_media_MediaPlayer_prepare},  
  11.     {"prepareAsync",        "()V",                              (void *)android_media_MediaPlayer_prepareAsync},  
  12.     {"_start",              "()V",                              (void *)android_media_MediaPlayer_start},  
  13.     {"_stop",               "()V",                              (void *)android_media_MediaPlayer_stop},  
  14.     {"getVideoWidth",       "()I",                              (void *)android_media_MediaPlayer_getVideoWidth},  
  15.     {"getVideoHeight",      "()I",                              (void *)android_media_MediaPlayer_getVideoHeight},  
  16.     {"seekTo",              "(I)V",                             (void *)android_media_MediaPlayer_seekTo},  
  17.     {"_pause",              "()V",                              (void *)android_media_MediaPlayer_pause},  
  18.     {"isPlaying",           "()Z",                              (void *)android_media_MediaPlayer_isPlaying},  
  19.     {"getCurrentPosition",  "()I",                              (void *)android_media_MediaPlayer_getCurrentPosition},  
  20.     {"getDuration",         "()I",                              (void *)android_media_MediaPlayer_getDuration},  
  21.     {"_release",            "()V",                              (void *)android_media_MediaPlayer_release},  
  22.     {"_reset",              "()V",                              (void *)android_media_MediaPlayer_reset},  
  23.     {"setAudioStreamType",  "(I)V",                             (void *)android_media_MediaPlayer_setAudioStreamType},  
  24.     {"setLooping",          "(Z)V",                             (void *)android_media_MediaPlayer_setLooping},  
  25.     {"isLooping",           "()Z",                              (void *)android_media_MediaPlayer_isLooping},  
  26.     {"setVolume",           "(FF)V",                            (void *)android_media_MediaPlayer_setVolume},  
  27.     {"native_invoke",       "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke},  
  28.     {"native_setMetadataFilter""(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},  
  29.     {"native_getMetadata""(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},  
  30.     {"native_init",         "()V",                              (void *)android_media_MediaPlayer_native_init},  
  31.     {"native_setup",        "(Ljava/lang/Object;)V",            (void *)android_media_MediaPlayer_native_setup},  
  32.     {"native_finalize",     "()V",                              (void *)android_media_MediaPlayer_native_finalize},  
  33.     {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},  
  34.     {"setAudioSessionId",   "(I)V",                             (void *)android_media_MediaPlayer_set_audio_session_id},  
  35.     {"setAuxEffectSendLevel""(F)V",                           (void *)android_media_MediaPlayer_setAuxEffectSendLevel},  
  36.     {"attachAuxEffect",     "(I)V",                             (void *)android_media_MediaPlayer_attachAuxEffect},  
  37.     {"native_pullBatteryData""(Landroid/os/Parcel;)I",        (void *)android_media_MediaPlayer_pullBatteryData},  
  38.     {"setParameter",        "(ILandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_setParameter},  
  39.     {"getParameter",        "(ILandroid/os/Parcel;)V",          (void *)android_media_MediaPlayer_getParameter},  
  40.     {"native_setRetransmitEndpoint""(Ljava/lang/String;I)I",  (void *)android_media_MediaPlayer_setRetransmitEndpoint},  
  41.     {"setNextMediaPlayer",  "(Landroid/media/MediaPlayer;)V",   (void *)android_media_MediaPlayer_setNextMediaPlayer},  
  42.     {"updateProxyConfig""(Landroid/net/ProxyProperties;)V", (void *)android_media_MediaPlayer_updateProxyConfig},  
  43. };  
如,
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {"getParameter",        "(ILandroid/os/Parcel;)V",          (void *)android_media_MediaPlayer_getParameter},  
就是代表java层函数void getParameter(int a , Parcel b),返回值是void,形参是init型和Parcel型
再如,

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {"native_setRetransmitEndpoint""(Ljava/lang/String;I)I",  (void *)android_media_MediaPlayer_setRetransmitEndpoint},  
就代表java层函数int native_setRetransmitEndpoint(String a, int b),返回值是int,形参是String型和int型
0 0