博客
关于我
Android JNI入门第三篇——jni头文件分析
阅读量:796 次
发布时间:2023-03-28

本文共 1638 字,大约阅读时间需要 5 分钟。

Java文件与JNI头文件分析

一、Java文件分析

首先,我们来看一下Java文件的内容。文件中定义了一个名为HeaderFile的类,这个类包含多个native方法。这些方法的定义具有以下特点:

  • 访问修饰符:所有方法都使用public修饰,privateprotected等修饰符不在JNI头文件中体现。
  • 返回类型:方法的返回类型包括基础类型(如voidint)、对象类型(如StringEnumerationStudent)以及数组类型。
  • 方法名:方法名直接使用Java语法规则,包含doVoid()doShort()doArray()等。
  • 参数类型:方法的参数包括JNIEnv*(JNI接口指针)和jobject(对象指针),具体参数类型根据方法需求有所不同。
  • static方法:部分方法标记为static,这在JNI头文件中有特殊体现。
  • 二、JNI头文件分析

    对应的JNI头文件包含了这些native方法的实现。头文件中每个方法的结构大致如下:

    JNIEXPORT [返回类型] JNICALL [Java类名_方法名](JNIEnv* env, [参数类型...]);

    其中:

  • JNIEXPORT:表示这是一个JNI函数,供Java调用。
  • JNICALL:表示这是一个标准的JNI方法调用标识符。
  • 返回类型:包括voidjintjobject等基本类型。
  • 参数:包括JNIEnv*jobjectjclass(对于静态方法)。
  • 注释部分:详细说明了每个方法的类名、方法名和签名。
  • 注释部分解析

    注释部分分为三部分:

  • Class:表示对应的Java类名。
  • Method:表示方法名。
  • Signature:表示方法的参数和返回类型。
  • 例如:

    /* com.nedu.jni.helloword.HeaderFile.doInt *//* Signature: (double,double)int */

    参数类型解析

  • 基本类型:对应Java中的byteshortintlongfloatdoublebooleanchar等。
  • 对象类型:表示Java对象,格式为L<包名/类名>。例如,java.lang.String对应Ljava/lang/String
  • 数组类型:前缀加上[,例如int[]对应[Idouble[]对应[D
  • 静态方法与非静态方法

  • 静态方法:在头文件中使用static修饰,参数为jclass(指向类)。
  • 非静态方法:参数为jobject(指向实例)。
  • 三、头文件结构解析

    从头文件结构来看,每个方法包含以下七个部分:

  • JNI关键字JNIEXPORTJNICALL
  • 返回类型:如voidjintjobject等。
  • 包名+类名:如com_nedu_jni_helloword_HeaderFile
  • 方法名:如doVoid
  • 参数:包括JNIEnv*和对应的jobjectjclass
  • 注释部分:详细说明类、方法和签名。
  • 实现部分:具体的JNI代码实现。
  • 参数解析

  • JNIEnv*:JNI接口指针,用于定位JNI接口表中的函数。
  • jobject:指向Java对象的指针,对于非静态方法。
  • jclass:指向Java类的指针,对于静态方法。
  • 四、方法声明

    具体方法声明示例:

    JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doVoid(JNIEnv* env, jobject obj);

    参数说明

    • envJNIEnv*接口指针。
    • objjobject对象指针(非静态方法)或jclass类指针(静态方法)。

    五、总结

    通过上述分析可以看出,Java文件中的native方法通过JNI头文件实现,头文件中包含了丰富的元信息,包括方法的签名、参数类型和注释说明。理解这些元信息对优化JNI调用和开发高效的JNI接口非常重要。

    转载地址:http://ishfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现波雷费密码算法(附完整源码)
    查看>>
    Objective-C实现洗牌移位密码算法(附完整源码)
    查看>>
    Objective-C实现测试信用卡号码有效性credit card validator的算法(附完整源码)
    查看>>