2012-12-13 20 views
5

में एक साधारण सी ++ कक्षा का उपयोग करें, मैं एंड्रॉइड एनडीके की मूल बातें सीखने की कोशिश कर रहा हूं, लेकिन जब मैं इसे सी ++ कक्षा के साथ उपयोग करना चाहता हूं तो मैं अटक गया हूं।एंड्रॉइड एनडीके

मैं समझता हूं कि इसे सरल कार्य के साथ कैसे उपयोग किया जाए, लेकिन मुझे फ़ील्ड और सी ++ कक्षा के तरीकों में हेरफेर करने में सक्षम होने के लिए क्या करना चाहिए?

मैं इस साधारण सी के साथ यह करने के लिए कोशिश कर रहा हूँ ++ वर्ग:

#include <cstdlib> 
#include <jni.h> 
using namespace std; 


class Point { 
    int x, y; // coordonnées du point 

    public: 
     Point() { 
     this->x = 0; 
     this->y = 0; 
     } 

     Point(int x, int y) { 
     this->x = x; 
     this->y = y; 
     } 

     int getX() const { 
     return x; 
     } 

     int getY() const { 
     return y; 
     } 

     Point symetrique() const { 
     return Point(-x, -y); 
     } 

     bool operator ==(const Point &p) const { 
     return this->x == p.getX() && this->y == p.getY(); 
     } 
}; 

extern "C" { 
    JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__ 
     (JNIEnv *, jobject); 

    JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__II 
     (JNIEnv *, jobject, jint, jint); 

    JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetX 
     (JNIEnv *, jobject, jlong); 

    JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetY 
     (JNIEnv *, jobject, jlong); 

    JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_nativeSymetrique 
     (JNIEnv *, jobject, jlong); 
}; 


JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__(JNIEnv* env, jobject thiz) { 
    return (jlong)(new Point()); 
} 

JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__II(JNIEnv* env, jobject thiz, jint x, jint y) { 
    return (jlong)(new Point(x, y)); 
} 

JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetX(JNIEnv* env, jobject thiz, jlong nativePointer) { 
    return ((Point*)nativePointer)->getX(); 
} 

JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetY(JNIEnv* env, jobject thiz, jlong nativePointer) { 
    return ((Point*)nativePointer)->getY(); 
} 

jlong Java_com_example_jnipoint_JPoint_nativeSymetrique(JNIEnv* env, jobject thiz, jlong nativePointer) { 
    return ((Point*)nativePointer)->symetrique(); 
} 

मैं अब तक नमूने लेकिन कुछ भी पता लगाने की कोशिश ... शायद मैं सही कीवर्ड्स

का उपयोग नहीं * अद्यतन *

मैं C++ प्वाइंट वर्ग के लिए एक जावा आवरण बनाया है और C++ फ़ाइल JNI तरीकों को जोड़ा गया।

public class JPoint { 

    private long nativePointer; 

    public JPoint() { 
     nativePointer = createPoint(); 
    } 

    public JPoint(int x, int y) { 
     nativePointer = createPoint(x, y); 
    } 

    public int getX() { 
     return nativeGetX(nativePointer); 
    } 

    public int getY() { 
     return nativeGetY(nativePointer); 
    } 

    public JPoint symetrique() { 
     JPoint tmp = new JPoint(); 
     tmp.nativePointer = nativeSymetrique(nativePointer); 
     return tmp; 
    } 

    // TODO 
    /*public boolean equals(Object o) { 
     return nativeEquals(o); 
    }*/ 

    private native long createPoint(); // Void constructor 
    private native long createPoint(int x, int y); 
    private native int nativeGetX(long nativePointer); 
    private native int nativeGetY(long nativePointer); 
    private native long nativeSymetrique(long nativePointer); 
    //private native boolean nativeEquals(Object p); TODO 
} 

अभी मैं nativeSymetrique समारोह के साथ stucked हूँ, यह दर्शाता है कि मैं 'प्वाइंट' 'jlong' में परिवर्तित नहीं कर सकते हैं: कोड निम्नलिखित है। क्या कोई इस पर मेरी मदद कर सकता है ? धन्यवाद

* अद्यतन 2 *

बड़ा घूँट मेरी मुद्दों को हल किया है, तो आप रैपर हाथ से लिखने की जरूरत नहीं है और यह बड़ा पुस्तकालयों के लिए एक अच्छा विकल्प हो रहा है।

+0

अच्छा सवाल, यदि आप "मुख्य()" से कुछ का उपयोग कर सकते हैं, तो आप मुख्य रूप से कुछ कार्यों को भी लिख सकते हैं जो वर्ग के कार्यों को कॉल करेंगे, यह बहुत बुरा तरीका है लेकिन शायद यह आपकी मदद करेगा :) –

+0

क्या आप इसका उपयोग करते हैं JNI? आपके कोड में जेएनआई रैपर कहां है? – dilix

+0

हां मैं जेएनआई का उपयोग करने की योजना बना रहा हूं लेकिन यह कोड सिर्फ एक साधारण सी ++ वर्ग है। मुझे आश्चर्य है कि मुझे जेएनआई को उस कोड के साथ कहां और कैसे रखा जाना चाहिए – Fr4nz

उत्तर

-2

जैसा कि मैंने अपने दूसरे अपडेट में कहा, SWIG मेरी आवश्यकताओं के लिए एकदम सही मैच था।

+0

इंटरनेट के साथ एक अच्छी बात है, अब कीवर्ड का उपयोग करके चीजों को ढूंढना आसान है (जैसे 'SWIG') – Fr4nz

0

आप जेएनआई के माध्यम से अपने सी कोड के साथ हेरफेर कर सकते हैं और जेएनआई के माध्यम से \ वापसी मूल्यों को पास कर सकते हैं, आप एंड्रॉइड/नमूने - हैलोजनी में जेएनआई नमूने पा सकते हैं।

उदाहरण के लिए:

JNIEXPORT jfloat JNICALL Java_com_opengl_glworld_GLWorldRenderer_changeCurrentArea(JNIEnv *env, jobject obj, jfloat curArea) 
{ 
    area = curArea; 
    return area; 
    // here you can execude you C code, you can access to methods of class, 
    // or method that use your classes. 
} 
+0

मुझे पता है कि मुझे जेएनआई का उपयोग करना है, मैंने उन नमूनों को पढ़ा है लेकिन सी ++ कक्षाओं और जेएनआई के बारे में क्या? आप कह रहे हैं कि मुझे अपने प्वाइंट क्लास के प्रत्येक तरीके के लिए जेएनआई फ़ंक्शन लिखना होगा? और मुझे मूल विधि के साथ जावा पक्ष पर एक समान वर्ग (प्वाइंट) बनाना होगा? – Fr4nz

+0

क्या आप वस्तुओं से जावा से सी ++ पास करना चाहते हैं? इस उत्तर http: // stackoverflow जांचें।कॉम/प्रश्न/4468276/कैसे-टू-पास-जावा-क्लास-इंस्टेंस-ए-पैरामीटर-टू-जेनी-विधि और Google जेएनआई = = – dilix

+0

वास्तव में सी ++ से जावा – Fr4nz

1

JNA पर एक नज़र डालें।

जेएनआई जावा से जावा कक्षाओं/ऑब्जेक्ट्स तक पहुंचने के लिए है जिसका अर्थ है कि जेएनआई आपको जेवीएम तक पहुंचने के लिए सी फ़ंक्शन देता है। लेकिन इसके विपरीत कोई तरीका नहीं है: जेवीएम से सी संरचनाओं (सी ++ कक्षाओं) तक पहुंचने के लिए। जावा में ऐसी कोई विधि नहीं है। इसलिए यदि आप सी ++ और जावा के बीच "क्लास प्रतिबिंब" रखना चाहते हैं, तो केवल आप जावा पक्ष पर कक्षा और जेएनआई सी कॉल के सेट को जावा ऑब्जेक्ट पर एक्सेस, संशोधित और कॉल करने के लिए कॉल कर सकते हैं। जावा पक्ष पर जेएनआई देशी विधियों का आपके लिए कोई उपयोग नहीं है, क्योंकि केवल पैरामीटर (इन या आउट) ले सकते हैं, केवल जावा ऑब्जेक्ट्स (या प्राइमेटिव्स या एरेज़) हो सकते हैं। जावा पक्ष में सी (++) संरचनाओं/ऑब्जेक्ट्स को पास करने का कोई तरीका नहीं है।

+0

उत्तर के लिए धन्यवाद, मुझे जेएनए – Fr4nz

+0

पर एक नज़र डालेंगी यह पोस्ट http://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code जेएनए मेरे उपयोग के लिए अच्छा नहीं है क्योंकि सी ++ – Fr4nz

+0

जेएनए निकटतम है जिसे आप प्राप्त कर सकते हैं जावा से देशी वस्तुओं तक पहुंच। जेएनआई कुछ भी प्रदान नहीं करता है, न ही जावा स्वयं करता है। तो यदि आपके लिए जेएनए अनुपयोगी है, तो दूसरा पैराग्राफ, और विशेष रूप से इसकी अंतिम वाक्य, मेरा जवाब है। –