//java类中声明
private long nativeHandle;
//jni层
//获取c++对象
inline jfieldID getHandleField(JNIEnv* env, jobject obj) {
jclass c = env->GetObjectClass(obj);
// J is the type singure for long:
return env->GetFieldID(c, "nativeHandle", "J");
}
template <typename T>
inline T* getHandle(JNIEnv* env, jobject obj) {
jlong handle = env->GetLongField(obj, getHandleField(env, obj));
return reinterpret_cast<T*>(handle);
}
//保存对象
template <typename T>
inline void setHandle(JNIEnv* env, jobject obj, T* t) {
jlong handle = reinterpret_cast<jlong>(t);
env->SetLongField(obj, getHandleField(env, obj), handle);
}
//jboolean to bool
inline bool toCppBool(jboolean value) {
return value == JNI_TRUE;
}
//bool to jboolean
jboolean ToJBool(bool value) {
return value ? JNI_TRUE : JNI_FALSE;
}
//使用
//保存方法
myclass* p = new myclass;
setHandle(env,obj,p);
//获取方法
myclass *p = getHandle<myclass >(env, obj);