Question

J'ai une grande quantité de code Java (uniquement des fonctions de calcul, pas d'interface utilisateur) que je souhaite réutiliser en tant que bibliothèque statique dans IOS. Mon approche était d'utiliser ROBOVM et suivez la manière non officielle pour créer une bibliothèque statique décrite dans les deux articles du forum Robovm : 1 manière de base et 2 version raffinée

Essayer de suivre les étapes exactement comme décrit que j'ai été bloquée malheureusement après avoir créé la bibliothèque partagée avec le script, reliant la bibliothèque (.a) dans Xcode et construire le projet avec succès.

Pendant l'exécution, je vois que mon code de pont C ++ est appelé, mais les rappels JNI de retour à la bibliothèque échouent avec un BAD_Access. Par exemple, les accidents de la ligne suivants:

jclass myJavaClass = jniEnv->FindClass("com/test/robovm/bridge/MyJavaRoboCode");

dans cette méthode:

void callSomethingInJava(const char* arg) {
    // To call into java from your native app, use JNI
    Env* rvmEnv = rvmGetEnv();
    JNIEnv* jniEnv = &(rvmEnv->jni);
    jclass myJavaClass = jniEnv->FindClass("com/test/robovm/bridge/MyJavaRoboCode");
    jmethodID myJavaMethod = jniEnv->GetStaticMethodID(myJavaClass, "callJava", "(Ljava/lang/String;)V");
    jstring argAsJavaString = jniEnv->NewStringUTF(arg);
    jniEnv->CallStaticVoidMethod(myJavaClass, myJavaMethod, argAsJavaString);

}

La même chose est vraie si j'essaie d'utiliser les méthodes RVMXX directement au lieu de JNI et essayez d'accéder à quelque chose dans mes classes "Java". On dirait que le RVMENV n'est pas complètement initialisé. (J'ai vérifié les erreurs de nom de package ou des fautes de frappe).

Ce serait formidable si quelqu'un réussissait déjà la création d'une bibliothèque statique commune d'un projet Robovm et pourrait partager l'expérience ici ou signaler moi dans la bonne direction pour résoudre le problème.

Était-ce utile?

La solution

Comme vous l'avez dit, vous n'avez probablement pas fini d'initialiser ROBOVM.

Vous devrez créer une méthode, disant InitiroBOVM (), à une méthode principale de BC.C quelque peu miroir.Ceci sera appelé par votre code lorsque vous souhaitez initialiser ROBOVM.Vous aurez besoin de passer le chemin de l'application dans lequel vous pouvez coder au code du disque lorsque vous testez.

InitiroBOBOVM () nécessitera des modifications, à savoir qu'il ne faut pas appeler la méthode principale de votre application Java, du moins, c'est ce que les bibliothèques qui se comportent bien ne devraient pas faire de l'OMI.Il ne devrait pas non plus appeler rvmshutdown.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top