मैं कुछ जावा कोड को कॉल करने का प्रयास कर रहा हूं जिसे मैंने एंड्रॉइड एनडीके का उपयोग करके सी से लिखा था। आवेदन एक मूल सक्रियता अनुप्रयोग है। मुझे कुछ कार्यक्षमता तक पहुंचना है जो केवल जावा में उपलब्ध है, और कार्यक्षमता के लिए आपको किसी अन्य वर्ग को उप-वर्ग करने की आवश्यकता है, इसलिए मैं सीधे सी से कॉल नहीं कर सकता। इस प्रकार, मेरे पास जावा कोड है:मैं एंड्रॉइड पर सी में अपनी जावा क्लास कैसे लोड करूं?
// src/com/example/my/package/SubClass.java
package com.example.my.package;
import android.foo.TheSuperClass;
public class SubClass extends TheSuperClass {
public SubClass() {
setImportantProperty(true);
}
}
त्रुटि: यह मेरे लिए एक "[सामान्य] java.lang.NoClassDefFoundError" देता चल रहा है,
// Some file.c
void setThatImportantJavaProperty() {
JavaVM *vm = AndroidGetJavaVM(); // This returns a valid JavaVM object
JNIEnv* env;
(*vm)->AttachCurrentThread(vm, &env, 0);
jclass theSubClass = (*env)->FindClass(env, "com/example/my/package/SubClass");
jthrowable exception = (*env)->ExceptionOccurred(env);
if (exception) {
(*env)->ExceptionDescribe(env);
// This gives me: "java.lang.NoClassDefFoundError: [generic]".
// Also, theSubClass is null, so the next line causes a segfault.
}
jmethodID theSubClassConstructor = (*env)->GetMethodID(env, theSubClass, "<init>", "()V");
jobject theSubClassObject = (*env)->NewObject(env, theSubClass, theSubClassConstructor);
(*env)->DeleteLocalRef(env, theSubClass);
(*env)->DeleteLocalRef(env, theSubClassConstructor);
(*env)->DeleteLocalRef(env, theSubClassObject);
(*vm)->DetachCurrentThread(vm);
}
के रूप में इनलाइन टिप्पणी कहते हैं:
मैं भी इस तरह सी कोड है। जब मैं अपने एपीके को अनपैक करता हूं, तो यह मुझे class.dex फ़ाइल दिखाता है, जिसमें मेरी कक्षा है। मेरा अनुमान है कि कुछ subtlety है कि मैं classpaths के बारे में याद कर रहा हूँ, लेकिन मैं अब तक इसे हल करने में असमर्थ हूं।
संयोग से, मैं किसी समस्या के बिना सी से मानक एंड्रॉइड पुस्तकालयों को समान कॉल करने में सक्षम हूं (उपरोक्त उसी सी फ़ंक्शन में)। विशेष रूप से, मैंने Log.v को कॉल करने का परीक्षण किया और यह आउटपुट को सही ढंग से काम करता है और प्रिंट करता है।
ऐसा लगता है कि मुझे लगता है कि सभी उदाहरण केवल सी से सामान्य जावा पुस्तकालयों को कॉल करने के लिए दिखाते हैं, जावा लाइब्रेरीज़ जिन्हें आपने स्वयं लिखा है, इसलिए मुझे तुलना करने के लिए एक उदाहरण प्रोजेक्ट भी नहीं मिला है।
क्या आपने इसे पढ़ा? http://developer.android.com/guide/practices/design/jni.html#faq_FindClass – Klaimmore
हाँ, मैंने किया। धन्यवाद - वह सही दिशा में जा रहा है, यह पता चला है। एक बार मैंने इसे पूरा करने के बाद एक पूरा समाधान पोस्ट करूंगा। – itfische
कृपया इसे भी देखें: http://groups.google.com/group/android-developers/browse_thread/thread/e090b94fe958ab31 – Wei