Android的NDK开发(4)————JNI数据结构之JNINativeMethod

转载 2015年12月04日 15:39:53

/********************************************************************************************
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com

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

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

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


1、JNINativeMethod 结构体的官方定义

  1. typedef struct {  
  2.   
  3. const char* name;  
  4. const char* signature;  
  5. void* fnPtr;  
  6. } JNINativeMethod;  

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

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

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

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

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


示例:

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


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

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

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

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

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


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




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


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

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

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


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

JNI数据结构之JNINativeMethod .Android的NDK开发(4)

转载自http://blog.csdn.net/conowen/article/details/7524744
  • u011497588
  • u011497588
  • 2014年11月17日 10:53
  • 224

Android的NDK开发(4)————JNI数据结构之JNINativeMethod

1、JNINativeMethod 结构体的官方定义 [cpp] view plaincopyprint? typedef struct {    const char* ...
  • lxmhuendan
  • lxmhuendan
  • 2014年11月12日 10:12
  • 486

Android的NDK开发(4)——JNI数据结构之JNINativeMethod

/********************************************************************************************  * au...
  • lb287875190
  • lb287875190
  • 2015年07月22日 17:18
  • 175

JNI demo手把手 && JNINativeMethod的参数解析 && JNI使用中的报错

(1)JNI工程建立         在Android目录下任意创建一个目录jnidemo,并在该目录下创建三个文件:Android.mk,用于编译JNI工程的makefile文件;jnidemo.c...
  • zhandoushi1982
  • zhandoushi1982
  • 2014年01月04日 11:26
  • 5171

NDK开发(四):JNI数据结构之JNINativeMethod

1、JNINativeMethod 结构体的官方定义 [cpp] view plaincopy typedef struct {      const char* name;  ...
  • lsong89
  • lsong89
  • 2015年01月26日 14:32
  • 328

NDK-JNI实战教程(一) 在Android Studio运行第一个NDK程序

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另...
  • yanbober
  • yanbober
  • 2015年04月27日 13:23
  • 89254

Android开发学习之路--NDK、JNI之初体验

好久没有更新博客了,最近一直在看一个仿微信项目,然后看源码并自己实现下,相信经过这个项目可以让自己了解一个项目中的代码以及种种需要注意的事项。不知不觉中博客已经快要40w访问量,而且排名也即将突破30...
  • eastmoon502136
  • eastmoon502136
  • 2016年02月28日 17:46
  • 14601

Android JNI/NDK开发(一)NDK真的很难吗?

1. Native (Android层面开发) 2. JNI(Android和C/C++连接层处理) 3. C/C++(逻辑处理层) Android JNI/NDK开发真的很难吗?不不不,三步快...
  • u014702653
  • u014702653
  • 2016年07月08日 14:57
  • 2338

JNI/NDK开发指南(开山篇)

转载请注明出处:         相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C...
  • xyang81
  • xyang81
  • 2014年12月05日 23:41
  • 18621

AndroidStudio 进行 JNI / NDK 开发:初步配置及使用

AndroidStudio 进行 JNI / NDK 开发:初步配置及使用 遇到的坑及补坑记录
  • zeqiao
  • zeqiao
  • 2017年09月08日 12:03
  • 1627
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的NDK开发(4)————JNI数据结构之JNINativeMethod
举报原因:
原因补充:

(最多只允许输入30个字)