मुझे कुछ सी फ़ंक्शंस मिल गए हैं जिन्हें मैं जेएनआई के माध्यम से बुला रहा हूं जो एक संरचना के लिए सूचक लेता है, और कुछ अन्य फ़ंक्शंस जो एक ही प्रकार की संरचना में पॉइंटर आवंटित/मुक्त करते हैं ताकि यह निपटने में थोड़ा आसान हो मेरा रैपर हैरानी की बात है कि जेएनआई दस्तावेज सी संरचनाओं से निपटने के बारे में बहुत कम कहता है।जेएनआई में जावा कोड पर आगे और आगे सी structs कैसे पास करें?
typedef struct _MyStruct {
float member;
} MyStruct;
MyStruct* createNewMyStruct();
void processData(int *data, int numObjects, MyStruct *arguments);
इसी JNI सी आवरण फ़ाइल है:
मेरे सी हेडर फाइल तो की तरह लग रहा
JNIEXPORT jobject JNICALL
Java_com_myorg_MyJavaClass_createNewMyStruct(JNIEnv *env, jobject this) {
return createNewMyStruct();
}
JNIEXPORT void JNICALL
Java_com_myorg_MyJavaClass_processData(JNIEnv *env, jobject this, jintArray data,
jint numObjects, jobject arguments) {
int *actualData = (*env)->GetIntArrayElements(env, data, NULL);
processData(actualData, numObjects, arguments);
(*env)->ReleaseIntArrayElements(env, data, actualData, NULL);
}
... और अंत में, इसी जावा वर्ग:
public class MyJavaClass {
static { System.loadLibrary("MyJniLibrary"); }
private native MyStruct createNewMyStruct();
private native void processData(int[] data, int numObjects, MyStruct arguments);
private class MyStruct {
float member;
}
public void test() {
MyStruct foo = createNewMyStruct();
foo.member = 3.14159f;
int[] testData = new int[10];
processData(testData, 10, foo);
}
}
दुर्भाग्यवश, यह कोड createNewMyStruct()
पर क्लिक करने के बाद JVM को क्रैश करता है। मैं जेएनआई के लिए थोड़ा नया हूं और मुझे पता नहीं है कि समस्या क्या हो सकती है।
संपादित करें: मुझे ध्यान रखना चाहिए कि सी कोड बहुत वैनिला सी है, अच्छी तरह से परीक्षण किया गया है और एक काम कर रहे आईफोन प्रोजेक्ट से पोर्ट किया गया था। साथ ही, यह प्रोजेक्ट एंड्रॉइड एनडीके फ्रेमवर्क का उपयोग कर रहा है, जो आपको जेएनआई के भीतर से एंड्रॉइड प्रोजेक्ट से देशी सी कोड चलाने देता है। हालांकि, मुझे नहीं लगता कि यह कड़ाई से एक एनडीके मुद्दा है ... यह मेरे हिस्से पर जेएनआई सेटअप/प्रारंभिक त्रुटि की तरह लगता है।
त्रुटि के बारे में कुछ और विशिष्ट? कोई त्रुटि संदेश? –
नहीं, यह सिर्फ जेआरई को दुर्घटनाग्रस्त करता है। जेएनआई से निपटने के बारे में यह एक गड़बड़ी है ... –
चेकजेएनआई सुविधा हेइज़नबग्स में आने से पहले सामान्य कोड त्रुटियों को खोजने के लिए जोड़ा गया था। यह एमुलेटर में डिफ़ॉल्ट रूप से सक्षम है। Http://android.git.kernel.org/?p=platform/dalvik.git;a=tree;f=docs;h=b0d3023109f548626cce1a9a586c95e82fb012ac;hb=HEAD पर jni-tips और एम्बेडेड-वीएम-कंट्रोल दस्तावेज़ देखें किसी डिवाइस पर इसे सक्षम करने की जानकारी। – fadden