Android JNI 使用的数据结构JNINativeMethod详解
2009-04-02 15:53
Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
Android JNI 使用的数据结构JNINativeMethod详解
2009-04-02 15:53
Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
第一个变量name是Java中函数的名字。
第二个变量signature,用字符串是描述了函数的参数和返回值
第三个变量fnPtr是函数指针,指向C函数。
其中比较难以理解的是第二个参数,例如
"()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"
第一个变量name是Java中函数的名字。
第二个变量signature,用字符串是描述了函数的参数和返回值
第三个变量fnPtr是函数指针,指向C函数。
其中比较难以理解的是第二个参数,例如
"()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"
分享到:
相关推荐
### Android Camera 架构深入解析 #### 一、Android Camera 概述 Android Camera 模块作为移动设备上的核心功能之一,在系统架构设计上显得尤为重要。为了更好地理解其内部工作原理,我们首先需要对它的整体架构有...
- **signature**:描述了方法的参数类型和返回值类型,格式类似于`"(Ljava/lang/String;I)Z"`,其中`L`表示对象引用,`I`表示整数类型等。 - **fnPtr**:指向实际C/C++实现的函数的指针。 - **Native Method**:...
static JNINativeMethod gMethods[] = { {"native_reload_static", "()I", (void*)android_media_AudioTrack_reload}, {"native_get_output_sample_rate", "(I)I", (void*)android_media_AudioTrack_get_output_...
scratch少儿编程逻辑思维游戏源码-足球冠军.zip
实训商业源码-【超人】积分商城 5.2.26-毕业设计.zip
windows,C# WInform,Excel操作类
这个函数可以直接把tdms文件的数据直接储存为MAT文件,并显示在工作区.具体的使用教程可以参考这篇文章。https://blog.csdn.net/weixin_41968197/article/details/106287744
φ3.2m两段式煤气发生炉CAD工艺流程图.rar
实训商业源码-daohang-毕业设计.zip
内容概要:文章深入探讨了在汽车电子电气架构中,网关ECU采用多CPU解决方案实现网关功能的技术背景、设计原则、挑战与解决方案、典型场景及其未来发展趋势。随着汽车电子电气架构向高集成化、智能化发展,网关ECU需处理复杂的多协议数据转发、协议转换、安全过滤等任务,单CPU难以满足需求。多CPU解决方案通过合理的架构设计,确保满足时延、吞吐量、资源管理等核心要求。文中详细介绍了多CPU架构的核心设计原则,包括内部接口设计、资源协同与容错设计,并针对典型场景提出了具体解决方案。此外,文章还讨论了多CPU架构面临的挑战及应对策略,并展望了未来的发展趋势,如异构计算融合、区域网关、确定性以太网等。; 适合人群:从事汽车电子工程领域的工程师和技术人员,尤其是对网关ECU设计和多CPU架构感兴趣的读者。; 使用场景及目标:①理解网关ECU中多CPU解决方案的必要性和优势;②掌握多CPU架构设计的关键技术和最佳实践;③了解多CPU架构在汽车电子电气架构中的应用前景和发展方向。; 其他说明:本文不仅提供了技术层面的深度解析,还强调了长期主义的重要性,鼓励读者在技术追求的同时保持对自身成长的关注。
实训商业源码-ddos压力测试-毕业设计.zip
JavaScript语言教程&案例&相关项目资源,奖励仅限VIP资源
实训商业源码-超级图文最新资源包及上传位置说明-毕业设计.zip
X-Y数控工作台机电系统设计.rar
实训商业源码-活码自动进群V1.0.0 开源版-毕业设计.zip
YZ8H压路机振动轮设计.rar
PE400x600复摆颚式破碎机设计.rar
scratch少儿编程逻辑思维游戏源码-像素森林.zip
scratch少儿编程逻辑思维游戏源码-躁狂症 RPG游戏.zip
scratch少儿编程逻辑思维游戏源码-战争模拟器(1).zip