Создайте статическую библиотеку IOS из проекта Robovm (Bad_Access в JNI)

StackOverflow https://stackoverflow.com//questions/25019762

Вопрос

У меня большое количество кода Java (только функции расчета, нет UI), которые я хочу повторно использовать в качестве статической библиотеки в iOS. Мой подход должен был использовать Robovm и следуйте неофициальному способу создания статической библиотеки, описанной в двух статьях на форуме Robovm : 1 базовый способ и 2 изысканная версия

Попытка выполнить шаги точно так, как описано, я застрял, к сожалению, после создания общей библиотеки со сценарием, связывая библиотеку (.a) в Xcode и успешно создавать проект.

Во время выполнения я вижу, что мой мостовой код C ++ вызывается, но JNI звонки обратно в библиотеку сбой с помощью Bad_Access. Например, следующая строка сбоя:

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

В этом методе:

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

}

То же самое верно, если я стараюсь использовать методы RVMXX непосредственно вместо JNI и попытаться получить доступ к чему-то в моем классах «Java». Похоже, RVMenv не полностью инициализируется. (Я дважды проверил ошибки имени пакета или опечатки).

Было бы здорово, если бы кому-то уже удалось с созданием общей статической библиотеки из проекта Robovm и может поделиться опытом здесь или указывать мне в правильном направлении, чтобы решить проблему.

Это было полезно?

Решение

Как вы упоминали, вы, вероятно, не закончили инициализации Robovm.

Вам нужно будет создать метод, скажем, initrobovm (), чтобы несколько зеркальный основной метод BC.C.Это будет называться вашим кодом, когда вы хотите инициализировать Robovm.Вам нужно будет пройти путь приложения, который вы можете жесткокодировать, когда вы тестируете.

initrobovm () понадобится некоторые модификации, а именно его не следует вызывать основной метод вашего приложения Java, ну, по крайней мере, вот в чем библиотеками в ведении не должно делать IMO.Это также должно не вызывать RVMShutdown.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top