से एक सहेजे गए जावा ऑब्जेक्ट में कॉल करना मेरे पास एक जावा ऑब्जेक्ट है जो जेएनआई के माध्यम से सी ++ साझा ऑब्जेक्ट में कॉल करता है। सी ++ में, मैं जेएनआईएनएनवी और जेब्जेक्ट का संदर्भ सहेज रहा हूं।जेएनआई के माध्यम से एक अलग थ्रेड
JavaVM * jvm;
JNIEnv * myEnv;
jobject myobj;
JNIEXPORT void JNICALL Java_org_api_init
(JNIEnv *env, jobject jObj) {
myEnv = env;
myobj = jObj;
}
मैं भी एक GLSurface रेंडरर है और यह अंत में सी ++ एक अलग धागे पर जैसा कि ऊपर उल्लेख साझा वस्तु, GLThread कहता है। मैं फिर शुरू में सहेजे गए नौकरी के उपयोग से अपने मूल जावा ऑब्जेक्ट में वापस कॉल करने का प्रयास कर रहा हूं, लेकिन मुझे लगता है कि क्योंकि मैं जीएलटीएचड पर हूं, मुझे निम्न त्रुटि मिलती है।
W/dalvikvm(16101): JNI WARNING: 0x41ded218 is not a valid JNI reference
I/dalvikvm(16101): "GLThread 981" prio=5 tid=15 RUNNABLE
I/dalvikvm(16101): | group="main" sCount=0 dsCount=0 obj=0x41d6e220 self=0x5cb11078
I/dalvikvm(16101): | sysTid=16133 nice=0 sched=0/0 cgrp=apps handle=1555429136
I/dalvikvm(16101): | schedstat=(0 0 0) utm=42 stm=32 core=1
कोड जावा में वापस बुला:
void setData()
{
jvm->AttachCurrentThread(&myEnv, 0);
jclass javaClass = myEnv->FindClass("com/myapp/myClass");
if(javaClass == NULL){
LOGD("ERROR - cant find class");
}
jmethodID method = myEnv->GetMethodID(javaClass, "updateDataModel", "()V");
if(method == NULL){
LOGD("ERROR - cant access method");
}
// this works, but its a new java object
//jobject myobj2 = myEnv->NewObject(javaClass, method);
//this is where the crash occurs
myEnv->CallVoidMethod(myobj, method, NULL);
}
, तो इसके बजाय मैं env-> NewObject उपयोग कर एक नया jObject बनाने के लिए, मैं succuessfully वापस जावा में कॉल कर सकते हैं, लेकिन यह है एक नई वस्तु और मुझे वह नहीं चाहिए। मुझे अपने मूल जावा ऑब्जेक्ट पर वापस जाने की आवश्यकता है।
क्या यह जावा में वापस जाने से पहले धागे को स्विच करने का मामला है? यदि हां, तो मैं ऐसा कैसे करूं?
पूरी तरह से काम किया! –
इस और अन्य युक्तियों के लिए http://developer.android.com/training/articles/perf-jni.html भी देखें। – fadden
धन्यवाद ... सरल और यह पूरी तरह से काम कर रहा है –