Pregunta

Tengo una gran cantidad de código Java (solo funciones de cálculo, no UI) que quiero reutilizar como una biblioteca estática en iOS. Mi enfoque era usar ROBOVM y sigue la forma no oficial de crear una biblioteca estática descrita en los dos artículos del Foro ROUVOVM : 1 forma básica y 2 versión refinada

Tratando de seguir los pasos exactamente como se describe, me quedé atascado, lamentablemente, después de crear la biblioteca compartida con el script, vincular la biblioteca (.a) en Xcode y construir el proyecto con éxito.

Durante el tiempo de ejecución, veo que se llama mi código de puente C ++, pero las llamadas JNI vuelven a la biblioteca fallan con un BAD_Access. Por ejemplo, la siguiente línea se bloquea:

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

En este método:

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 mismo ocurre si trata de usar los métodos RVMXX directamente en lugar de JNI y tratar de acceder a algo en mis clases "Java". Parece que el RVMENV no está completamente inicializado. (Realicto de doble revisión de errores de nombre de paquete o tipográficos).

Sería genial si alguien ya haya tenido éxito con la creación de una biblioteca estática compartida de un proyecto ROUVOVM y podría compartir la experiencia aquí o apuntarme en la dirección correcta para resolver el problema.

¿Fue útil?

Solución

Como mencionó, probablemente no haya terminado de inicializar ROBOVM.

Necesitará crear un método, digamos initrobovm (), al método principal de BC.C uniforme de BC.C.Esto será llamado por su código cuando desee inicializar ROBOVM.Tendrá que pasar la ruta de la aplicación, que puede cucharonar cuando está probando.

initrobovm () necesitará algunas modificaciones, a saber, no debe llamar al método principal de su aplicación de Java, al menos, al menos, eso es lo que las bibliotecas de buen comportamiento no deben hacer la OMI.Tampoco debe llamar a RvmShutdown.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top