Android结构JNINativeMethod介绍

news/2024/11/15 3:36:56/

@[Android JNINativeMethod介绍]

Android JNI 数据结构JNINativeMethod说明

Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。
其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:

typedef struct {const char* name;const char* signature;void* fnPtr;
} JNINativeMethod;
  • 第一个变量name是Java中函数的名字。

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

"()V"
"(II)V"
"(Ljava/lang/String;Ljava/lang/String;)V"

实际上这些字符是与函数的参数类型一一对应的。

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

“(II)V” 表示 void Func(int, int);

普通类型

字符   Java类型        C类型V      void            void
Z      jboolean        boolean
I      jint            int
J      jlong           long
D      jdouble         double
F      jfloat          float
B      jbyte           byte
C      jchar           char
S      jshort          short

数组类型

以"["开始,用两个字符表示[I     jintArray       int[]
[F     jfloatArray     float[]
[B     jbyteArray      byte[]
[C     jcharArray      char[]
[S     jshortArray     short[]
[D     jdoubleArray    double[]
[J     jlongArray      long[]
[Z     jbooleanArray   boolean[]

上面的都是基本类型。
如果Java函数的参数是class,则以"L"开头,以";“结尾
中间是用”/" 隔开的包及类名。
而其对应的C函数名的参数则为jobject.
一个例外是String类,其对应的类为jstring

如:

Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。
例如 
"(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"

ijkplayer中的定义为样例参考

static JNINativeMethod g_methods[] = {{"_setDataSource",   "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V",   (void *) IjkMediaPlayer_setDataSourceAndHeaders},{ "_setDataSourceFd",       "(I)V",     (void *) IjkMediaPlayer_setDataSourceFd },{ "_setDataSource",         "(Ltv/danmaku/ijk/media/player/misc/IMediaDataSource;)V", (void *)IjkMediaPlayer_setDataSourceCallback },{ "_setAndroidIOCallback",  "(Ltv/danmaku/ijk/media/player/misc/IAndroidIO;)V", (void *)IjkMediaPlayer_setAndroidIOCallback },{ "_setVideoSurface",       "(Landroid/view/Surface;)V", (void *) IjkMediaPlayer_setVideoSurface },{ "_prepareAsync",          "()V",      (void *) IjkMediaPlayer_prepareAsync },{ "_start",                 "()V",      (void *) IjkMediaPlayer_start },{ "_stop",                  "()V",      (void *) IjkMediaPlayer_stop },{ "seekTo",                 "(J)V",     (void *) IjkMediaPlayer_seekTo },{ "_pause",                 "()V",      (void *) IjkMediaPlayer_pause },{ "isPlaying",              "()Z",      (void *) IjkMediaPlayer_isPlaying },{ "getCurrentPosition",     "()J",      (void *) IjkMediaPlayer_getCurrentPosition },{ "getDuration",            "()J",      (void *) IjkMediaPlayer_getDuration },{ "_release",               "()V",      (void *) IjkMediaPlayer_release },{ "_reset",                 "()V",      (void *) IjkMediaPlayer_reset },{ "setVolume",              "(FF)V",    (void *) IjkMediaPlayer_setVolume },{ "getAudioSessionId",      "()I",      (void *) IjkMediaPlayer_getAudioSessionId },{ "native_init",            "()V",      (void *) IjkMediaPlayer_native_init },{ "native_setup",           "(Ljava/lang/Object;)V", (void *) IjkMediaPlayer_native_setup },{ "native_finalize",        "()V",      (void *) IjkMediaPlayer_native_finalize },{ "_setOption",             "(ILjava/lang/String;Ljava/lang/String;)V", (void *) IjkMediaPlayer_setOption },{ "_setOption",             "(ILjava/lang/String;J)V",                  (void *) IjkMediaPlayer_setOptionLong },{ "_getColorFormatName",    "(I)Ljava/lang/String;",    (void *) IjkMediaPlayer_getColorFormatName },{ "_getVideoCodecInfo",     "()Ljava/lang/String;",     (void *) IjkMediaPlayer_getVideoCodecInfo },{ "_getAudioCodecInfo",     "()Ljava/lang/String;",     (void *) IjkMediaPlayer_getAudioCodecInfo },{ "_getMediaMeta",          "()Landroid/os/Bundle;",    (void *) IjkMediaPlayer_getMediaMeta },{ "_setLoopCount",          "(I)V",                     (void *) IjkMediaPlayer_setLoopCount },{ "_getLoopCount",          "()I",                      (void *) IjkMediaPlayer_getLoopCount },{ "_getPropertyFloat",      "(IF)F",                    (void *) ijkMediaPlayer_getPropertyFloat },{ "_setPropertyFloat",      "(IF)V",                    (void *) ijkMediaPlayer_setPropertyFloat },{ "_getPropertyLong",       "(IJ)J",                    (void *) ijkMediaPlayer_getPropertyLong },{ "_setPropertyLong",       "(IJ)V",                    (void *) ijkMediaPlayer_setPropertyLong },{ "_setStreamSelected",     "(IZ)V",                    (void *) ijkMediaPlayer_setStreamSelected },{ "native_profileBegin",    "(Ljava/lang/String;)V",    (void *) IjkMediaPlayer_native_profileBegin },{ "native_profileEnd",      "()V",                      (void *) IjkMediaPlayer_native_profileEnd },{ "native_setLogLevel",     "(I)V",                     (void *) IjkMediaPlayer_native_setLogLevel },{ "_setFrameAtTime",        "(Ljava/lang/String;JJII)V", (void *) IjkMediaPlayer_setFrameAtTime },
};
  • 第三个变量fnPtr是函数指针,指向C函数。

http://www.ppmy.cn/news/193998.html

相关文章

【004 设备驱动】驱动中操作物理绝对地址为什么要先ioremap?

一、ioremap函数 ioremap 函数用于获取指定物理地址空间对应的虚拟地址空间: #define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) void __iomem * __arm_ioremap(phys_addr_t phys_addr, size_t size, unsigned int mtype) { return arch…

2022年面对会议平板的进击:商务投影机面临压力

根据国家工商行政管理总局的数据,2021年中国实际主体数量达到1.3亿,其中企业实际主体数量达到3858万,其中会议室实际主体较多。根据数据,中国约有2000万个会议室。许多会议室都需要大屏幕显示设备。 但商业投影仪市场一直处于数百…

由投影仪到智能会议平板,经历怎样的发展过程?

十几年前,几乎所有公司都是清一色的使用投影仪办公,但现在大企业中已经很难看到投影仪的身影,比如华为、腾讯等;那这些公司都是使用什么来投屏的呢?它就是近年比较火热的会议办公神器--智能会议平板。 会议平板是怎样…

android 投影技术,激光虚拟投影 从谷歌眼镜谈IT整合之路

1谷歌眼镜 虚拟投影 [中关村在线投影机频道原创]谷歌眼镜,一个标志性的电子产品,整合了激光、虚拟显示、处理、识别、网络、移动存储等最热门的技术。然而,谷歌眼镜的出现,也遭受前所未有的非议和围观,一方是翘首期盼的…

墨卡托投影参数设置_横轴墨卡托投影坐标设置与导入导出CAD文件讲解

在日常的工作中,很多用户需要将北京54、西安80以及CGCS2000等平面坐标系的CAD文件导入到奥维中,以实现AutoCAD和奥维互动地图浏览器之间的协同设计。而在电子地图中,坐标系均为经纬度坐标。那么,要实现将平面坐标的文件导入到奥维中,就需要在导入的过程中进行坐标转换。当…

c#实现透视投影

之前在研究c opencv,通过掉opencv接口,实现三维坐标转到二维坐标,但是一直没有时间去搞。刚好最近项目需要,用到c#来实现透视投影,然后就细致研究了下。总体而言还是离不开小孔成像模型: 关键就是三个步骤&…

java 梯形校正_高清投影神器 联想YOGA平板2 Pro评测

联想YOGA平板2 Pro集成了投影功能,这让其成为名副其实的高清神器,那么在实际使用中它的表现如何?且看评测揭晓。 高清投影神器 联想YOGA平板2 Pro评测 视频作为现在一种最普遍的娱乐方式,已然成为我们日常生活中不可缺少的一部分&…

投影仪上能安装摄像头上互动网课吗?保姆级投影仪上网课教程分享

如今越来越多的学生朋友加入了网课大军的队伍,网课设备也越来越齐全。从手机、电视慢慢增加,变成了手机、电视、平板、投影仪。投影仪作为新晋网课神器,可能大家还没有完完全全的了解它的宝藏,今天就让我们一起来看看怎么用手机电…