加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

NDK开发 - JNI数组数据处理

发布时间:2021-03-07 02:17:06 所属栏目:大数据 来源:网络整理
导读:许多时辰操作 NDK 开拓都是为了对数据举办加密操纵,由于纯真的 Java 太轻易被反编译了,加密算法也就很轻易被破解,而操作 C/C++ 开拓可以加大破解难度。文件的数据加密就必要通过 byte 数组传给 JNI。 传送门: NDK开拓 - JNI数组数据处理赏罚 JNI 中的数组分

  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: 表现全部类和成员

NDK开拓 - JNI数组数据处理赏罚

Java 根基范例与要领署名中参数范例和返回值范例的映射相关如下:

  好比,String fun(int a,float b,boolean c,String d) 对应的 JNI 要领署名为:(IFZLjava/lang/String;)Ljava/lang/String;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读