JNI之------JNINativeMethod
来源:互联网 发布:大学网络教育专业 编辑:程序博客网 时间:2024/06/05 18:09
文章出处:http://blog.csdn.net/shift_wwx
前言:之前的一篇(Android基础总结之九:JNI详解)是结合实例的简单总结,这边总结一下JNINativeMethod。
1、JNINativeMethod 结构体的官方定义
- typedef struct {
- const char* name;
- const char* signature;
- void* fnPtr;
- } JNINativeMethod;
第二个变量signature,用字符串是描述了Java中函数的参数和返回值
第三个变量fnPtr是函数指针,指向native函数。前面都要接 (void *)
第一个变量与第三个变量是对应的,一个是java层方法名,对应着第三个参数的native方法名字示例:
- static JNINativeMethod methods[] = {
- { "printJNI", "()I", (void*)printForTest},
- };
主要是第二个参数比较复杂:
括号里面表示参数的类型,括号后面表示返回值。
"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Fun();
"(II)V" 表示 void Fun(int a, int b);
2、第二个参数之基本类型
3、第二个参数之对象类型和数组类型
对象类型:以"L"开头,以";"结尾,中间用"/"隔开。如表第一行。
数组类型:以"["开头,如表第二行(n维数组的话,则前面就n个"[",如"[[[D"就表示double[ ][ ][ ])。
对象数组类型:就是上述两者结合,如表第三行。
4、举例
5、结合Media中的看看
- 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},
再如,
- {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer_setRetransmitEndpoint},
0 0
- JNI之------JNINativeMethod
- JNI之------JNINativeMethod
- JNI之二:JNI demo手把手 && JNINativeMethod的参数解析
- JNI数据结构之JNINativeMethod .Android的NDK开发(4)
- NDK开发(四):JNI数据结构之JNINativeMethod
- Android JNI JNINativeMethod register
- JNI数据结构 JNINativeMethod
- Android JNI の struct JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)——JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- Android的NDK开发(4)————JNI数据结构之JNINativeMethod
- WIndows下编译libexif-0.6.21,生成VS下可用的dll和lib
- redis 命令
- MAC OS X socket 1 [a simple example]
- 解读Wi-Fi航班:陆基、星基两大技术支撑
- [网易科技]微信硬件接口并没有想象中的那么美!
- JNI之------JNINativeMethod
- iOS中Block(2)
- linux zip/unzip命令
- httpd.conf中一旦修改DocumentRoot为其他的目录出现Forbidden
- uva 467 - Synching Signals(暴力+数学)
- Tomcat Server.xml文件配置
- 马云留下的感悟
- iOS中block(3)
- 混淆打包apk时 proguard-project的配置