私は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は私の問題を解決し、あなたはラッパーを手書きする必要はありませんし、大きな図書館のための良い選択であるように思われます。
"main()"から何かを使うことができるのであれば、クラスの関数を呼び出すmainにいくつかの関数を書くこともできますが、それは非常に悪い方法ですが、おそらく助けになります:) –
JNI?あなたのコードにJNIラッパーはどこですか? – dilix
はい私はJNIを使用する予定ですが、このコードは単純なC++クラスです。私はどこでどのようにJNIをそのコードに入れるべきだろうと思っています – Fr4nz