/********************************************************************************************
* author:[email protected]大钟
* E-mail:[email protected]

*site:http://www.idealpwr.com/

*深圳市动力思维科技发展有限公司
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。

********************************************************************************************/


1、JNINativeMethod 结构体的官方定义

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

第一个变量name是Java中函数的名字。

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

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

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

更多内容请查看之前博文:http://blog.csdn.net/conowen/article/details/7521340


示例:

/*  * 由于gMethods[]是一个<名称,函数指针>对照表,在程序执行时,  * 可多次调用registerNativeMethods()函数来更换本地函数的指针,  * 从而达到弹性调用本地函数的目的。   *具体可以参看http://blog.csdn.net/conowen/article/details/7521340 */  static JNINativeMethod gMethods[] = {      {"setDataSource",       "(Ljava/lang/String;)V",            (void *)com_media_ffmpeg_FFMpegPlayer_setDataSource},      {"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)com_media_ffmpeg_FFMpegPlayer_setVideoSurface},      {"prepare",             "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_prepare},      {"_start",              "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_start},      {"_stop",               "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_stop},      {"getVideoWidth",       "()I",                              (void *)com_media_ffmpeg_FFMpegPlayer_getVideoWidth},      {"getVideoHeight",      "()I",                              (void *)com_media_ffmpeg_FFMpegPlayer_getVideoHeight},      {"seekTo",              "(I)V",                             (void *)com_media_ffmpeg_FFMpegPlayer_seekTo},      {"_pause",              "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_pause},      {"isPlaying",           "()Z",                              (void *)com_media_ffmpeg_FFMpegPlayer_isPlaying},      {"getCurrentPosition",  "()I",                              (void *)com_media_ffmpeg_FFMpegPlayer_getCurrentPosition},      {"getDuration",         "()I",                              (void *)com_media_ffmpeg_FFMpegPlayer_getDuration},      {"_release",            "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_release},      {"_reset",              "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_reset},      {"setAudioStreamType",  "(I)V",                             (void *)com_media_ffmpeg_FFMpegPlayer_setAudioStreamType},      {"native_init",         "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_native_init},      {"native_setup",        "(Ljava/lang/Object;)V",            (void *)com_media_ffmpeg_FFMpegPlayer_native_setup},      {"native_finalize",     "()V",                              (void *)com_media_ffmpeg_FFMpegPlayer_native_finalize},      {"native_suspend_resume", "(Z)I",                           (void *)com_media_ffmpeg_FFMpegPlayer_native_suspend_resume},  };    


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

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

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

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

这些字符与函数的参数类型的映射表如下:


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

Android的NDK开发(4)————JNI数据结构之JNINativeMethod_第1张图片



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

Android的NDK开发(4)————JNI数据结构之JNINativeMethod_第2张图片


对象类型:以"L"开头,以";"结尾,中间是用"/" 隔开。如上表第1个

数组类型:以"["开始。如上表第2个(n维数组的话,则是前面多少个"["而已,如"[[[D"表示“double[][][]”)

对象数组类型:上述两者结合,如上表第3个


3.1、对象类型与数组类型的举例:

Android的NDK开发(4)————JNI数据结构之JNINativeMethod_第3张图片

更多相关文章

  1. 【Android】Android自定义属性,attr format取值类型
  2. Android笔记四 虚拟机Dalvik、Android各种java包功能、Android相
  3. Android各种类型Dialog点击空白处自动关闭问题
  4. sencha touch 调用android主函数里的方法(可用与phoneGap开发第三
  5. android工程下的文件资源类型
  6. 安卓入门及界面带参数跳转
  7. 设置activity为Dialog类型的设置
  8. 从UA类型设备分辨出Android设备类型
  9. Android sql数据库的Android包里面的函数介绍

随机推荐

  1. 浅入浅出 Android 安全(五)Android 应用层
  2. Android任意窗口添加固定/浮动窗体:音乐播
  3. 谈谈如何学好Android==个人看法
  4. Android远程service aidl的用法
  5. Android照相和录音功能的使用
  6. Android下的串口通信实战之电子秤交互
  7. android游戏开发实例-可局域网对战的飞行
  8. Flutter与Android原生代码交互
  9. Android中的4.0新布局控件:Space和GridLay
  10. Android(安卓)应用程序发布流程注意事项(