JNI の JNINativeMethod - Android

転載元:JNI------JNINativeMethod_プライベートキッチンブログ-CSDNブログ

 

JNINativeMethod 構造体の公式定義 

typedef struct {  
    const char* name;  
    const char* signature;  
    void* fnPtr;  
} JNINativeMethod;

最初の変数名は Java の関数の名前です。

2 番目の変数、signature は、文字列を使用して Java の関数のパラメータと戻り値を記述します。

3 番目の変数 fnPtr は、ネイティブ関数を指す関数ポインターです。(void *) を前に付ける必要があります

最初の変数は 3 番目の変数に対応し、1 つは Java レイヤーのメソッド名で、3 番目のパラメーターのネイティブ メソッド名に対応します。

例:

static JNINativeMethod methods[] = {  
  { "printJNI", "()I",        (void*)printForTest},  
    
}; 

 

2 番目のパラメータの概要

主な理由は、2 番目のパラメータがより複雑であるためです。

パラメータの型は括弧内に示され、戻り値は括弧の後に示されます。

「()」内の文字はパラメータを表し、以降の文字は戻り値を表します。たとえば、「()V」は void Fun() を意味します。

「(II)V」は void Fun(int a, int b); を示します。

2番目のパラメータの基本型

 

2 番目のパラメータのオブジェクト型と配列型

オブジェクトの種類: 「L」で始まり、「;」で終わり、「/」で区切られます。表の最初の行に示されているように。

配列タイプ: 表の 2 行目に示されているように、「[」で始まります (n 次元配列の場合、先頭に n 個の「[」が表示されます。たとえば、「[[[D」は double[ ][ を意味します) ][ ])。

オブジェクト配列タイプ: 表の 3 行目に示されているように、上記 2 つの組み合わせです。
 

 

 メディアと合わせてご覧ください

static JNINativeMethod gMethods[] = {
    {
        "_setDataSource",
        "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V",
        (void *)android_media_MediaPlayer_setDataSourceAndHeaders
    },
 
    {"_setDataSource",       "(Ljava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer_setDataSourceFD},
    {"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer_setVideoSurface},
    {"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},
    {"seekTo",              "(I)V",                             (void *)android_media_MediaPlayer_seekTo},
    {"_pause",              "()V",                              (void *)android_media_MediaPlayer_pause},
    {"isPlaying",           "()Z",                              (void *)android_media_MediaPlayer_isPlaying},
    {"getCurrentPosition",  "()I",                              (void *)android_media_MediaPlayer_getCurrentPosition},
    {"getDuration",         "()I",                              (void *)android_media_MediaPlayer_getDuration},
    {"_release",            "()V",                              (void *)android_media_MediaPlayer_release},
    {"_reset",              "()V",                              (void *)android_media_MediaPlayer_reset},
    {"setAudioStreamType",  "(I)V",                             (void *)android_media_MediaPlayer_setAudioStreamType},
    {"setLooping",          "(Z)V",                             (void *)android_media_MediaPlayer_setLooping},
    {"isLooping",           "()Z",                              (void *)android_media_MediaPlayer_isLooping},
    {"setVolume",           "(FF)V",                            (void *)android_media_MediaPlayer_setVolume},
    {"native_invoke",       "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke},
    {"native_setMetadataFilter", "(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},
    {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},
    {"native_init",         "()V",                              (void *)android_media_MediaPlayer_native_init},
    {"native_setup",        "(Ljava/lang/Object;)V",            (void *)android_media_MediaPlayer_native_setup},
    {"native_finalize",     "()V",                              (void *)android_media_MediaPlayer_native_finalize},
    {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},
    {"setAudioSessionId",   "(I)V",                             (void *)android_media_MediaPlayer_set_audio_session_id},
    {"setAuxEffectSendLevel", "(F)V",                           (void *)android_media_MediaPlayer_setAuxEffectSendLevel},
    {"attachAuxEffect",     "(I)V",                             (void *)android_media_MediaPlayer_attachAuxEffect},
    {"native_pullBatteryData", "(Landroid/os/Parcel;)I",        (void *)android_media_MediaPlayer_pullBatteryData},
    {"setParameter",        "(ILandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_setParameter},
    {"getParameter",        "(ILandroid/os/Parcel;)V",          (void *)android_media_MediaPlayer_getParameter},
    {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I",  (void *)android_media_MediaPlayer_setRetransmitEndpoint},
    {"setNextMediaPlayer",  "(Landroid/media/MediaPlayer;)V",   (void *)android_media_MediaPlayer_setNextMediaPlayer},
    {"updateProxyConfig", "(Landroid/net/ProxyProperties;)V", (void *)android_media_MediaPlayer_updateProxyConfig},
};

のように、

{"getParameter",        "(ILandroid/os/Parcel;)V", 
 (void *)android_media_MediaPlayer_getParameter},


これは Java レイヤ関数 void getParameter(int a, Parcel b) を表し、戻り値は void で、仮パラメータは init 型と Parcel 型です

{"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", 
 (void *)android_media_MediaPlayer_setRetransmitEndpoint},


Javaレイヤ関数intnative_setRetransmitEndpoint(String a, int b)を表し、戻り値はint、仮引数はString型とint型です。
 

おすすめ

転載: blog.csdn.net/xiaopei_yan/article/details/130885366