У меня есть большой объем кода Java (только функции расчета, без пользовательского интерфейса), который я хочу повторно использовать в качестве статической библиотеки в 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 и мог бы поделиться здесь опытом или указать мне правильное направление для решения проблемы.