2012-12-13 16 views
5

私はAndroid NDKの基本を学びたいと思っていますが、私はC++クラスで使用する必要があるときに固執しています。Android NDKのシンプルなC++クラスを使用してください

私は単純な関数でそれを使用する方法を理解していますが、C++クラスのフィールドとメソッドを操作できるようにするにはどうすればよいですか?

私はこの単純なC++クラスでそれをやろうとしている

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

私はたぶん私は右のキーワードに

を使用していないよ...これまでのサンプルが、何を見つけることを試みました * *

UPDATE は、私はC++ PointクラスのJavaラッパーを作成し、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​​」に「ポイント」を変換することはできませんと言っています。誰かが私にこれを助けることができますか?おかげ

* UPDATE 2 *

はSWIGは私の問題を解決し、あなたはラッパーを手書きする必要はありませんし、大きな図書館のための良い選択であるように思われます。

+0

"main()"から何かを使うことができるのであれば、クラスの関数を呼び出すmainにいくつかの関数を書くこともできますが、それは非常に悪い方法ですが、おそらく助けになります:) –

+0

JNI?あなたのコードにJNIラッパーはどこですか? – dilix

+0

はい私はJNIを使​​用する予定ですが、このコードは単純なC++クラスです。私はどこでどのようにJNIをそのコードに入れるべきだろうと思っています – Fr4nz

答えて

-2

私の2回目の更新で述べたように、SWIGは私のニーズに合ったものでした。

+0

インターネットでいいことは、キーワード(SWIGなど)を使って物事を見つけるのは簡単です – Fr4nz

0

あなたの望むようにCコードを操作し、JNI経由で値を返すことができます。JNIサンプルはandroidndk/samples-helloJniにあります。例えば

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

私はJNIを使​​用しなければならないことを知っています。私はそれらのサンプルを読んでいますが、C++クラスとJNIはどうですか?私のPointクラスの各メソッドにJNI関数を記述しなければならないと言っていますか?そして、ネイティブメソッドでJava側に同様のクラス(Point)を作成する必要がありますか? – Fr4nz

+0

javaからC++にオブジェクトを渡しますか?この回答を確認するhttp:// stackoverflow。com/questions/4468276/how-to-pass-java-class-instance-as-as-as-jni-methodとgoogleがJNIでobjecを渡すのを助けることができます=) – dilix

+0

実際にはC++からJava – Fr4nz

1

JNAを見てください。

JNIは、CのJavaクラス/オブジェクトにアクセスするためのものです。つまり、JNIはJVMにアクセスするためのC関数を提供します。しかし、JVMからC構造(C++クラス)にアクセスする方法はありません。 Javaにはそのようなメソッドはありません。したがって、C++とJavaの間に「クラスリフレクション」が必要な場合は、Java側のクラスとJavaオブジェクトのメソッドへのアクセス、変更、および呼び出しのための一連のJNI C呼び出しを持つことだけができます。 Java側のJNIネイティブメソッドは、あなたにとっては役に立たない。なぜなら、それが取ることができる(または出る)パラメータは、Javaオブジェクト(またはプリミティブまたは配列)だけであるからです。 C(++)構造体/オブジェクトをJava側に渡す方法はありません。

+0

答えをありがとう、私はJNAを見てみよう – Fr4nz

+0

この投稿はhttp://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code JNAはC++のために私の使用にはうまくいきません – Fr4nz

+0

JNAはあなたに近づけることができますJavaからネイティブオブジェクトにアクセスする。 JNIはまったく何も提供しません.JNI自体は何も提供しません。だから、もしJNAがあなたのために使えないなら、第2段落、特にそれの最後の文が私の答えです。 –

関連する問題