2012-12-13 38 views
5

Android NDK'nın temellerini öğrenmeye çalışıyorum ama C++ sınıfı ile kullanmam gerektiğinde sıkışıp kaldım.Android NDK'da basit bir C++ sınıfı kullanın

Basit bir işlevle nasıl kullanılacağını anlıyorum ama C++ sınıfının alanlarını ve yöntemlerini kullanabilmek için ne yapmalıyım?

Ben bu basit c ile yapmaya çalışıyorum ++ sınıfı: Şimdiye kadar numune başka bir şey bulmaya çalıştılar

#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(); 
} 

... Belki doğru anahtar kelimeleri

kullanmıyorum * *

GÜNCELLEME ben C++ Nokta sınıfı için bir Java sarıcı oluşturulan ve C++ dosya JNI yöntemlerine ekledi.

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 
} 

Şu anda nativeSymetrique fonksiyonu ile stucked değilim, ben 'jlong' için 'Noktasını' dönüştürmek olamayacağını söylüyor: Kod şudur. Bana bu konuda birileri yardımcı olabilir mi ? Teşekkür

* yudum benim sorunlarını çözmüş GÜNCELLEME 2 *

, sen sarmalayıcılarını el yazısıyla yazmak gerekmez ve o büyük kütüphaneler için iyi bir seçim gibi görünüyor.

+0

iyi bir soru, eğer "main()" dan bir şey kullanabiliyorsanız, sınıf fonksiyonlarını çağıracak ana işlevler de yazabildiğinizden çok daha kötü bir yoldur ama belki size yardımcı olacaktır :) –

+0

JNI'yı? JNI sarmalayıcı kodunuzda nerede? – dilix

+0

Evet JNI kullanmayı planlıyorum, ancak bu kod sadece basit bir C++ sınıfı. JNI'yi bu kodla – Fr4nz

cevap

-2

İkinci güncellememde dediğim gibi, SWIG ihtiyaçlar için mükemmel bir eşdi.

+0

Internet ile güzel bir şey, artık anahtar kelimeler kullanarak (SWIG gibi) işleri bulmak çok kolay. – Fr4nz

0

C kodunuz ile istediğiniz gibi işlem yapabilir ve JNI aracılığıyla değerleri döndürebilirsiniz, androidnk/örneklerde JNI örneklerini bulabilirsiniz - helloJni. Örneğin

:

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

nereye koyacağımı merak ediyorum. JNI kullanmam gerektiğini biliyorum, bu örnekleri okudum ama C++ sınıfları ve JNI? Point sınıfımın her yöntemi için bir JNI işlevi yazmam gerektiğini söylüyorsun? Ve Java tarafında yerel yöntemle benzer bir sınıf (Nokta) oluşturmam gerekecek mi? – Fr4nz

+0

Nesneleri java'dan C++ 'ya geçirmek istiyor musunuz? Bu cevabı http: // stackoverflow olarak kontrol edin.com/questions/4468276/how-to-pass-java-class-instance-as-a-parameter-to-jni-method ve google, JNI =) içindeki objecs geçişinde yardımcı olabilir =) – dilix

+0

Aslında C++ 'dan Java – Fr4nz

1

JNA göz at. JNI, Java sınıflarına/nesnelere C'den erişme anlamına gelir. Bu, JNI'nin, JVM'ye erişmek için C işlevlerini verdiği anlamına gelir. Ancak bunun tersi de yoktur: JVM'den C yapılarına (C++ sınıfları) erişmek. Java'nın böyle bir yöntemi yoktur. C++ ile Java arasında bir "sınıf yansıması" elde etmek istiyorsanız, yapmanız gereken tek şey Java tarafında sınıfa sahip olmak ve Java nesnesindeki yöntemlere erişmek, bunları değiştirmek ve aramak için JNI C çağrıları yapmaktır. Java tarafındaki JNI yerel yöntemleri sizin için hiçbir yararı yoktur, çünkü alabileceği tek parametreler (içeri veya dışarı) sadece Java nesneleri (veya ilkel veya diziler) olabilir. C (++) yapıları/nesneleri Java tarafına geçirmenin hiçbir yolu yoktur.

+0

Cevabınız için teşekkürler, JNA'ya bir göz atacağım – Fr4nz

+0

Bu yazı http://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code JNA benim kullanımım için iyi değil çünkü C++ – Fr4nz

+0

JNA'ya en yakın Java'dan yerel nesnelere erişme. JNI hiçbir şey sağlamaz, ne de Java kendi içinde. Eğer JNA sizin için kullanılamazsa, o zaman ikinci paragraf ve özellikle de son cümlesi benim cevabımdır. –