项目场景:
最近公司需要通过java调用设备的so库,这边需要通过jni的方式在对方的so基础上再封装一层接口。
问题描述
在jni中,我需要在函数调用的过程中给形参传递一个内存地址过去,并让它保存
原因分析:
java中没有指针,所以考虑修改参数的值,让参数中保存指针的地址
解决方案:
代码看详情
JNIEXPORT jint JNICALL Java_RFID_linux_Gzandearfid_RDR_1Open(JNIEnv *env, jclass jc,
jstring connStr, jobject hrOut)
{
/* 申请一个指针 */
RFID_READER_HANDLE hr = NULL;
/* 打开成功 hr将会被分配地址,关键在于现在需要形参hrOut 保存这个指针的地址,方便其它接口调用 */
err_t ret = RDR_Open(env->GetStringUTFChars(connStr, JNI_FALSE), &hr);
/* 通过env找到形参的类 */
jclass intClass = env->GetObjectClass(hrOut);
/* 通过env找到形参的id */
jfieldID intId = env->GetFieldID(intClass, "value", "J");
/* 这一步是关键修改形参的值,我这边将这个指针强制转换位jlong 就是取出指针的内存地址*/
env->SetLongField(hrOut, intId, (jlong)hr);
return ret;
}```