从robovm项目创建iOS静态库(JNI中的BAD_ACCESS)

wfr*_*ank 5 java java-native-interface objective-c static-libraries robovm

我有大量的Java代码(只有计算函数,没有UI),我想在iOS中作为静态库重用.我的方法是使用robovm并按照非官方的方式创建一个静态库,在robovm论坛的两篇文章中描述:1基本方式2精炼版本

尝试按照描述完全按照步骤操作,在使用脚本创建共享库,链接Xcode中的库(.a)并成功构建项目之后,我不幸遇到了问题.

在运行期间,我看到我的C++桥代码被调用,但JNI回调到库失败并带有BAD_ACCESS.例如,以下行崩溃:

jclass myJavaClass = jniEnv->FindClass("com/test/robovm/bridge/MyJavaRoboCode");
Run Code Online (Sandbox Code Playgroud)

在这个方法中:

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);
Run Code Online (Sandbox Code Playgroud)

}

如果我尝试直接使用rvmXX方法而不是JNI并尝试访问"Java"类中的某些内容,情况也是如此.看起来rvmEnv没有完全初始化.(我仔细检查了包名错误或拼写错误).

如果有人已经成功地从robovm项目创建了一个共享静态库并且可以在这里分享经验或指出我正确的方向来解决问题,那将是很棒的.

小智 3

正如您所提到的,您可能尚未完成 robovm 的初始化。

您需要创建一个方法,例如 initRoboVM(),以在某种程度上反映 bc.c 的 main 方法。当您想要初始化 robovm 时,您的代码将调用此函数。您需要传入应用程序路径,您可以在测试时对其进行硬编码。

initRoboVM() 需要一些修改,即它不应该调用 Java 应用程序的 main 方法,至少,在我看来,行为良好的库不应该这样做。它也不应该调用 rvmShutdown。