我有大量的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”类中的内容,则为true是真的。它看起来rvmenv未完全初始化。 (我仔细检查了包名称错误或拼写错误)。

如果有人已经成功创建了来自Robovm项目的共享静态库,并且可以在这里分享经验或指向正确的方向来解决问题,这将是伟大的。

有帮助吗?

解决方案

如上所述,您可能还没有完成初始化ROBOVM。

您需要创建一个方法,例如,initrobovm(),以某种镜像bc.c.c的主要方法。当您想要初始化Robovm时,您的代码将被调用。您需要通过应用程序路径,您可以在测试时硬码。

initrobovm()需要一些修改,即它不应该拨打你的java应用程序的主要方法,嗯,至少,这就是表现良好的库不应该做imo。它也不应该呼叫rvmshutdown。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top