Hey guys. This is how I'm doing most of my callbacks. Is this how your doing it or am I making it harder than it actually is?
//
// ForceAndTorque callback convertion
//
struct ForceAndTorqueCallback {
jobject body;
jobject callback;
jclass c;
jmethodID id;
void setup() {
c = GetEnv()->GetObjectClass(callback);
id = GetEnv()->GetMethodID(c, "NewtonApplyForceAndTorque", "(LJNewton$NewtonBody;)V");
}
void Callback(const NewtonBody *b) {
GetEnv()->CallVoidMethod(this->callback, this->id, this->body);//newNB(GetEnv(), body));
}
};
//custom table collection
jHash<const NewtonBody*, ForceAndTorqueCallback*> _ForceAndTorqueCallback;
static void ForceAndTorqueCallbackWrapper(const NewtonBody *body) {
ForceAndTorqueCallback *me = _ForceAndTorqueCallback[body];
me->Callback(body);
}
JNIEXPORT void JNICALL Java_JNewton_NewtonBodySetForceAndTorqueCallback(JNIEnv *env, jclass, jobject body, jobject callback) {
ForceAndTorqueCallback* cb = new ForceAndTorqueCallback();
cb->body = env->NewWeakGlobalRef(body);
cb->callback = env->NewWeakGlobalRef(callback);
cb->setup();
//converts java objects to structures
NewtonBody *b = objToNB(env, body);
_ForceAndTorqueCallback.Append(b, cb);
NewtonBodySetForceAndTorqueCallback(b, ForceAndTorqueCallbackWrapper);
}
JNIEXPORT jobject JNICALL Java_JNewton_NewtonBodyGetForceAndTorqueCallback(JNIEnv *env, jclass, jobject body) {
return _ForceAndTorqueCallback.Find(objToNB(env, body))->GetValue()->callback;
}
Thanks.