L'utilisation d'une simple classe c++ sur Android NDK
Je suis en train d'apprendre les bases de Android NDK mais je suis coincé quand je dois l'utiliser avec une classe c++.
Je comprends comment l'utiliser avec une fonction simple, mais que dois-je faire pour être en mesure de manipuler les champs et les méthodes d'une classe c++?
Je suis en train de faire avec cette simple classe 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();
}
J'ai essayé de trouver des échantillons, mais rien pour l'instant... Peut-être que je ne suis pas en utilisant les bons mots-clés
* Mise à JOUR *
J'ai créé un wrapper Java pour le c++ de la classe Point et ajouté au fichier c++ JNI méthodes. Le code est le suivant :
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
}
Maintenant je suis coincé avec le nativeSymetrique fonction, il est dit que je ne peut pas convertir de 'Point' à 'jlong'. Quelqu'un peut-il m'aider sur ce point ? Grâce
* Mise à JOUR 2 *
RASADE résolu mes problèmes, vous n'avez pas à écrire à la main les wrappers et il semble être un bon choix pour les grandes bibliothèques.
utilisez-vous JNI? Où est JNI wrapper dans votre code?
Oui j'ai l'intention d'utiliser JNI, mais ce code n'est qu'une simple classe c++. Je me demande où et comment je dois mettre JNI avec ce code
OriginalL'auteur Fr4nz | 2012-12-13
Vous devez vous connecter pour publier un commentaire.
Ont un coup d'oeil à JNA.
JNI est destiné à l'accès des classes Java/objets de C. ce Qui signifie que JNI vous donne les fonctions C pour accéder à la JVM. Mais il n'existe aucun moyen vice versa: pour accéder à la C structures (classes C++) de la JVM. Java n'a pas de telles méthodes. Donc, si vous voulez avoir une "réflexion" entre C++ et Java, la seule chose que vous pouvez faire est d'avoir la classe Java côté et un ensemble de JNI C les appels d'accès, de modification et appeler des méthodes sur l'objet Java. JNI des méthodes indigènes sur l'île de Java côté sont d'aucune utilité pour vous, parce que les seuls paramètres qu'il peut prendre (in ou out) peut être à nouveau qu'à des objets Java (ou primitives ou des tableaux). Il est tout simplement impossible de passer à C(++) des structures ou des objets Java côté.
Selon ce post stackoverflow.com/questions/1556421/... JNA n'est pas bon pour mon utilisation en raison de c++
JNA est le plus proche que vous pouvez obtenir à l'accès à des objets natifs de l'île de Java. JNI ne fournit pas de rien du tout, ni ne Java en lui-même. Donc, si JNA est inutilisable pour vous, alors le deuxième paragraphe, et en particulier la dernière phrase, c'est ma réponse.
OriginalL'auteur Pavel Zdenek
Vous pouvez manipuler à l'aide de votre code en C que vous le souhaitez et pass\les valeurs de retour via JNI, vous pouvez trouver JNI échantillons dans androidndk/échantillons - helloJni.
Par exemple:
Voulez-vous passer des objets à partir de java c++? Cochez cette réponse, stackoverflow.com/questions/4468276/... et google peuvent aider à passer des objecs dans JNI =)
En fait à partir de c++ à Java
stackoverflow.com/questions/2504334/...
OriginalL'auteur dilix
Comme je l'ai dit dans mon deuxième mise à jour, SWIG était le match parfait pour mes besoins.
OriginalL'auteur Fr4nz