如何将模板类的父类设为抽象类?JNI相关代码编译报错求解
问题说明
- 你当前的父类
FieldAccessor已经定义了纯虚函数virtual jobject getValue(jobject, jobject) = 0;,本身就已经是抽象类,满足你的设计需求,不需要额外调整父类定义。 - 编译报错的核心原因是类成员函数指针不能直接像普通函数一样调用,必须绑定到对应的类实例上才能执行,你代码里的
getFieldValueFunction是JNIEnv类的成员函数指针,需要绑定到当前的jNIEnv实例上调用。
修复方案
仅需要修改getValue方法中调用成员函数指针的语法,使用->*运算符调用成员函数指针,同时额外加括号保证运算优先级正确即可,修改后的代码如下:
template<typename Type> jobject PrimitiveFieldAccessor<Type>::getValue(jobject target, jobject field) { jfieldID fieldId = jNIEnv->FromReflectedField(field); return jNIEnv->NewObject( this->type, this->constructorId, // 修改点:使用正确的成员函数指针调用语法 (jNIEnv->*getFieldValueFunction)(target, fieldId) ); }
额外优化建议
你在子类PrimitiveFieldAccessor的构造函数中已经通过父类构造函数FieldAccessor(env)初始化了受保护成员jNIEnv,不需要再重复执行this->jNIEnv = env;,可以删掉这行冗余代码。
内容的提问来源于stack exchange,提问作者JJB
相关产品推荐
相关产品推荐

