転載元: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型です。