2011-08-30 16 views
9

से दूसरे पैकेज के एक स्थिर जावा पद्धति को कॉल करें, मान लें कि एंड्रॉयड में, मैं स्थिर विधि android.os.SystemClock.elapsedRealtime(), जो एक लंबे देता है, मूल कोड के एक हिस्से से कॉल करने की आवश्यकता हैं। mylib.c फ़ाइल में, मैंउदाहरण के लिए मूल कोड

JNIEXPORT jlong JNICALL 
Java_com_mpackage_MyClass_nativeMethod(JNIEnv *env, jobject obj){ 

    jclass cls = (*env)->GetObjectClass(env, obj); 
    jmethodID mid = (*env)->GetStaticMethodID(env, cls, "android.os.SystemClock.elapsedRealtime", "(V)J"); 

    if (mid == 0) 
    return 0L; 

    return CallStaticLongMethod(cls, mid); 
} 

जावा MyClass.class में है, मैं दूसरों

static {System.loadLibrary("myLib");} 
native long nativeMethod(); 

के बीच है, लेकिन जब मैं इसे कहते हैं, मैं निम्नलिखित त्रुटि मिलती है:

ERROR/AndroidRuntime(628): java.lang.NoSuchMethodError: 
android.os.SystemClock.elapsedRealtime() 

पर mid लाइन की घोषणा। मुझे लगता है कि यह सीधा है लेकिन मैं जेनी के लिए नया हूँ।

किसी ने मेरी गलती (रों) का कहना है सकते हैं?

उत्तर

8

ऐसा लगता है कि JNI एपीआई के आपके उपयोग उचित नहीं है। सबसे पहले आप android.os.SystemClock के वर्ग संदर्भ मिलना चाहिए। ओबीजे पैरामीटर के रूप में पारित, MyClass का एक वस्तु है। आप (*env)->FindClass(env, "android/os/SystemClock") का उपयोग SystemClock के लिए एक jclass पाने के लिए करना चाहिए। फिर विधि आईडी प्राप्त करने के लिए (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J"); पर कॉल करें। अधिक जानकारी के

+2

के लिए JNI tutorial पर एक नजर डालें मैं इस अपने आप को कुछ मिनट पहले मिल गया था! हालांकि, मुझे '(* env) -> FindClass (env, "android/os/SystemClock") जैसे वर्ग के लिए नाम निर्दिष्ट करना था। धन्यवाद! – Tom

+0

आप सही हैं। यह एक टाइपो/कॉपी-पेस्ट गलती थी :-) – jogabonito

संबंधित मुद्दे