📑 JNI 使用基础 密级: 【C-1】 | 时间:2024-02-01 | 目录:编程开发 | 编辑本文 文章距今已发表三个月,请自行判断文中技术方法、代码的有效性:) ## Native层传递复杂对象给Java层 ![](https://p0.meituan.net/xianfu/e393776df36742ca9135d4825527792d17924.png%40watermark=1&&object=L3dkY2Zsb3cvN2RiN2M4NTFjYmVjZDg4MTM1OTZjMTYzOWE2MzQ4MDM0MjY0LnBuZw==&p=8&t=90&x=10&y=10) 定义了一个Device的内部类,get方法在native层获取属性返回对象。 类型修改为jobject ![](https://p0.meituan.net/xianfu/e1cafa8f07482fc5d325f03b28f7e98431916.png%40watermark=1&&object=L3dkY2Zsb3cvN2RiN2M4NTFjYmVjZDg4MTM1OTZjMTYzOWE2MzQ4MDM0MjY0LnBuZw==&p=8&t=90&x=10&y=10) 通过env->findclass方法找到类 ![](https://p0.meituan.net/xianfu/507f186d2838a63ddddcefa19846de2423460.png%40watermark=1&&object=L3dkY2Zsb3cvN2RiN2M4NTFjYmVjZDg4MTM1OTZjMTYzOWE2MzQ4MDM0MjY0LnBuZw==&p=8&t=90&x=10&y=10) 通过clazz与getMethodID的方法获取构造方法,由于类构造函数的属性有三个string类型的值,需要通过Ljava/lang/String;来定义,L代表是引用类型,引用java/lang/String的类型,再以;分割。写三个即可,对于基本类型的参数,不需要使用 L 来表示。在 JNI 中,基本类型的参数可以直接使用对应的类型字符来表示,例如 I 表示整数类型(int),J 表示长整数类型(long),F 表示浮点数类型(float),等等。 ![](https://p0.meituan.net/xianfu/736b63f9382fe8f3bddf9db66e9376be40715.png%40watermark=1&&object=L3dkY2Zsb3cvN2RiN2M4NTFjYmVjZDg4MTM1OTZjMTYzOWE2MzQ4MDM0MjY0LnBuZw==&p=8&t=90&x=10&y=10) 最后通过jstring定义要设置的属性值 jstring protobuf = env->NewStringUTF(hexString.c_str()); jstring aesKey = env->NewStringUTF(strAesKey.c_str()); jstring aesIv = env->NewStringUTF(strAesIV.c_str()); return env->NewObject(device_cls,constructMId,protobuf,aesKey,aesIv); 在通过newObject的方法返回对象。 ## Native层调用java层方法 ```cpp extern "C" JNIEXPORT void JNICALL Java_com_example_a2023110803_MainActivity_nativeMethod(JNIEnv *env, jclass obj) { // 找到类 jclass cls = env->FindClass("com/example/a2023110803/MainActivity"); // 根据类找到方法 jmethodID methodId = env->GetMethodID(cls, "sendReq", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); // 创建三个jstring参数 jstring param1 = env->NewStringUTF("Hello"); jstring param2 = env->NewStringUTF("World"); jstring param3 = env->NewStringUTF("!"); // 在jni中创建对象 jobject object = env->AllocObject(cls); // 调用 sendReq 方法 env->CallVoidMethod(object, methodId, param1,param2, param3); // 释放字符串参数的引用 env->DeleteLocalRef(param1); env->DeleteLocalRef(param2); env->DeleteLocalRef(param3); } ``` 评论列表 写评论 您的IP:3.145.79.139,临时用户名:d6ff9b96评论已接入DepyWAF审计与流量系统,请勿频繁操作导致IP拉黑 提交评论 © 版权声明:非标注『转载』情况下本文为原创文章,版权归 Depy's docs 所有,转载请联系博主获得授权。