2010-10-27 7 views
19

मेरे पास एनडीके लाइब्रेरी और संबंधित जावा-क्लास का एक कार्यान्वयन कार्यान्वयन है। लेकिन मैं उस वर्ग में ओवरलोडेड विधि जोड़ने में सक्षम नहीं हूं। वर्तमान में मेरी कक्षा में शामिल हैं:एंड्रॉइड एनडीके में देशी विधि हस्ताक्षर लिखने का सही तरीका क्या है?

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    static 
    { 
    System.loadLibrary("mylib"); 
    } 
} 

मेरे jniwrappers.cpp फ़ाइल निम्न घोषणा है:

JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz); 

इस बिंदु सब कुछ अप करने के लिए काम कर रहा है ठीक। लेकिन अगले मैं अपने वर्ग को संशोधित:

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    public static native String getFileName(int index); 
    ... 
} 

और एक और घोषणा jniwrappers.cpp में जोड़ें:

JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index); 

यह ठीक, एंड्रॉयड आवेदन शुरू होता है संकलित, UnsatisfiedLinkError नहीं मिलता है लेकिन जब यह साथ दूसरी विधि कॉल तर्क पहली सी ++ फ़ंक्शन कहा जा रहा है लेकिन दूसरा नहीं। मेरे पास उस वर्ग में तर्क के साथ अन्य विधियां हैं लेकिन उनमें से कोई भी ओवरलोड नहीं किया गया है, इसलिए उनके संबंधित जेएनआई हस्ताक्षर में तर्क नहीं हैं।

तो, मैं गलत क्या कर रहा हूं?

उत्तर

20

आपको मूल getFileName फ़ंक्शन के अंत में __ जोड़ना होगा, जिसे अब अधिभारित किया गया है। आपका 2 सी समारोह प्रोटोटाइप अब इस तरह दिखना चाहिए:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__ 
    (JNIEnv *, jclass); 

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I 
    (JNIEnv *, jclass, jint); 
+0

यह पहली बात थी जिसकी मैंने कोशिश की लेकिन कुछ गलत हो गया और मुझे असंतुष्ट लिंक्स त्रुटि मिली। अब मैंने इसे फिर से लिया है और सबकुछ काम कर रहा है। आपका बहुत बहुत धन्यवाद! –

25

आप javah उपकरण का उपयोग उन हस्ताक्षर उत्पन्न करने के लिए करना चाहिए।

इसका उपयोग करने के लिए, कक्षा फ़ाइल बनाएं जहां आपके पास native फ़ंक्शन है। आपको class फ़ाइल मिल जाएगी।

रन javah -jni com.organisation.class_with_native_func, यह आपके लिए एक हेडर फ़ाइल जेनरेट करेगा।

यह स्वयं को संपादित करने से कहीं अधिक स्वच्छ है।

+3

धन्यवाद, यही मुझे उपयोग करना चाहिए। लेकिन अभी भी आंतरिक जानना बहुत उपयोगी है। –

+0

या केवल क्लास फ़ाइल को संकलित करने के लिए सीधे javah पर -classpath कमांड लाइन स्विच का उपयोग करें, यानी: 'javah -classpath/path/to/jar -jni com.package.name.YourClass')। –

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