Native 要领起首挪用 JNI 函数 FindClass 获取 Person 类的引用,假如 Person 类加载失败的话, FindClass 会返回 NULL,然后抛出一个 java.lang.NoClassDefFoundError 非常。 接下来通过 GetMethodID 获取了类的默认结构函数的ID(下一节会先容)。而且通过 GetFieldId 获取了Person变量的ID,用于后头的赋值。 挪用 NewObjectArray 建设一个数组,在for轮回中 NewObject 实例化 Person类,并通过 SetXXField 函数给实例变量赋值。SetObjectArrayElement 将实例化工具插入数组。 最后挪用 DeleteLocalRef 要领开释局部变量。 DeleteLocalRef 将新建设的 引用从引用表中移除。在 JNI 中,只有 jobject 以及子类属于引用变量,会占用引用表的空间,jint,jfloat,jboolean 等都是根基范例变量,不会占用引用表空间,即不必要开释。引用表最大空间为 512 个,假如超出这个范畴,JVM 就会挂掉。
要领署名
在上面的的例子中,在挪用实例变量可能要领,都必需传入一个 jmethodID 的参数。由于在 Java 中存在要领重载(要领名沟通,参数列表差异),以是要明晰汇报 JVM 挪用的是类或实例中的哪一个要领。挪用 JNI 的 GetMethodID 函数获取一个 jmethodID 时,必要传入一个要领名称和要领署名,要领名称就是在 Java 中界说的要领名,要领署名的名目为:(形参参数范例列表)返回值。形参参数列表中,引用范例以 L 开头,后头紧跟类的全路径名(需将.所有替代成/),以分号末了。 可以通过 javap 呼吁获取类的署名,以 Person 为例:
javap -s -p app.build.intermediates.classes.all.debug.com.example.gnaix.ndk.Person
参数声名:
-s: 输出内部范例署名
-p: 表现全部类和成员

Java 根基范例与要领署名中参数范例和返回值范例的映射相关如下:
好比,String fun(int a,float b,boolean c,String d) 对应的 JNI 要领署名为:(IFZLjava/lang/String;)Ljava/lang/String; 。
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|