Android的NDK开发(4)————JNI数据结构之JNINativeMethod
1、JNINativeMethod 结构体的官方定义
![](https://code.csdn.net/assets/CODE_ico.png)
- 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
示例:
![](https://code.csdn.net/assets/CODE_ico.png)
- /*
- * 由于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、第二个参数之基本数据类型
3、第二个参数之对象类型与数组类型
对象类型:以"L"开头,以";"结尾,中间是用"/" 隔开。如上表第1个
数组类型:以"["开始。如上表第2个(n维数组的话,则是前面多少个"["而已,如"[[[D"表示“double[][][]”)
对象数组类型:上述两者结合,如上表第3个
3.1、对象类型与数组类型的举例:
Android的NDK开发(4)————JNI数据结构之JNINativeMethod相关推荐
- Z型射精管理Android(4),Android的NDK开发(4)————JNI数据结构之JNINativeMethod
/******************************************************************************************** * auth ...
- Android的NDK开发(3)————JNI数据类型的详解
原文:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...
- JNI编程基础(二)——Android Studio NDK开发
由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的N ...
- Android之NDK开发
一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语 ...
- Android之NDK开发学习总结
Android之NDK开发 http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台 ...
- delphi android jni,Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用...
一.Android平台编程方式: 1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现) 2.自从ndk r5发布以后,已经允许完全用C/C ...
- Android下NDK开发环境搭建
Android下NDK开发环境搭建 1. AndroidNDK安装与配置 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...
- 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )
文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...
- 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...
最新文章
- 使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)
- java 接口工程_Java工程师(15)抽象类与接口
- 汇总|目标检测中的数据增强、backbone、head、neck、损失函数
- ccna考试真题及经验介绍
- 图书大甩卖(操作系统、C语言、Linux) 已成交
- java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态
- 制作多系统启动盘教程_制作U盘启动盘教程
- C#开发笔记之18-如何用C#模拟(传统方法)发送Post请求或Get请求?
- Pytorch —— GPU的使用
- centos虚拟机安装,配置静态ip可以访问网络
- vForum 2016:VMware vSAN实战常见注意事项
- 归并排序的空间复杂度
- 浅谈javascript的面向对象(OOP)
- 黑客帝国中代码雨如何实现?用 Python 就可以!
- Linux Spark安装教程
- 《机器学习实战笔记--第一部分 分类算法:决策树 3》
- 怎样申请.EDU邮箱
- 冯·米塞斯迭代法(Von Mises iteration)
- 我们将与操作系统工作谈一场无私的爱──《云情人》思考
- 对于算法工程师职业生涯规划的考虑