Domanda

Ho una grande quantità di codice Java (solo funzioni di calcolo, nessuna UI) che voglio riutilizzare come biblioteca statica in iOS. Il mio approccio era quello di usare robovm e seguire il modo non ufficiale per creare una libreria statica descritta nei due articoli nel forum Robovm : 1 modo di base e 2 versione raffinata

Cercando di seguire i passaggi esattamente come descritto Sono rimasto bloccato Sfortunatamente dopo aver creato la Biblioteca condivisa con lo script, collegando la libreria (.a) in XCode e costruire correttamente il progetto.

Durante il runtime vedo che il mio codice Bridge C ++ viene chiamato ma il JNI richiama la libreria fallisce con un Bad_access. Ad esempio, la seguente linea si blocca:

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

In questo metodo:

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);
.

}

Lo stesso è vero se provo a utilizzare i metodi RVMXX direttamente invece di JNI e provare ad accedere a qualcosa nelle mie classi "Java". Sembra che il rvmenv non sia completamente inizializzato. (Ho ricontrollato per gli errori o i tipi di errori dei nomi del pacchetto).

Sarebbe bello se qualcuno è già riuscito con la creazione di una biblioteca statica condivisa da un progetto Robovm e potrebbe condividere l'esperienza qui o indicarmi nella giusta direzione per risolvere il problema.

È stato utile?

Soluzione

Come hai detto, probabilmente non hai finito di inizializzare Robovm.

Dovrai creare un metodo, dire inirobovm (), al metodo principale a specchio BC.C.Questo sarà chiamato dal tuo codice quando vuoi inizializzare Robovm.Avrai bisogno di passare il percorso dell'app, che puoi hardcode quando stai testando.

IniTrobovm () avrà bisogno di alcune modifiche, vale a dire non dovrebbe chiamare il metodo principale dell'app della tua Java, beh, almeno, ecco quali Biblioteche ben educate non dovrebbero fare imo.Inoltre, non dovrebbe chiamare rvmshutdown.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top