|   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;。 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |