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

NDK开发 - JNI数组数据处理

发布时间:2021-03-11 11:11:48 所属栏目:大数据 来源:网络整理
导读:副标题#e# 很多时候利用 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;

(编辑:源码网)

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

热点阅读