【问题标题】:Create iOS static library from robovm project (BAD_ACCESS in JNI)从 robovm 项目创建 iOS 静态库(JNI 中的 BAD_ACCESS)
【发布时间】:2014-09-21 02:06:34
【问题描述】:

我有大量的 Java 代码(只有计算函数,没有 UI),我想在 iOS 中将它们作为静态库重用。我的做法是使用robovm,按照robovm论坛两篇文章中描述的非官方方式创建静态库:1 Basic way2 Refined version

尝试完全按照描述的步骤操作,不幸的是,在使用脚本创建共享库、在 Xcode 中链接库 (.a) 并成功构建项目后,我陷入了困境。

在运行时,我看到调用了我的 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 项目创建了一个共享静态库,并且可以在这里分享经验或指出我解决问题的正确方向,那就太好了。

【问题讨论】:

  • 嗨 wfrank - 我一直在尝试这样做,但我无法让 Xcode 编译 robovm/jni。您描述的两篇文章听起来很有希望,但想知道是否有可以分享/推荐的项目示例?

标签: java objective-c java-native-interface static-libraries robovm


【解决方案1】:

正如你所说,你可能还没有完成初始化 robovm。

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

initRoboVM() 将需要一些修改,即它不应该调用您的 Java 应用程序的 main 方法,至少,这是 IMO 中表现良好的库不应该做的事情。它也不应该调用 rvmShutdown。

【讨论】:

  • 感谢您的帮助。我现在可以通过 JNI 从 Objective C 调用“Java”。也许我应该指出调用 bc.c main 是因为我无法删除 main 方法,因为 robovm 编译器会对“crt0 中缺少 _main 符号”异常感到不满。现在我需要关闭我的原生 iOS Apps 主方法,让 Robovm 主方法启动我的 AppDelegate。目前我正在努力从作业中取回 Objc 对象。 Java 对象用 @NativeClass 注释...但我猜这是一个新的 Stack Overflow 问题。
猜你喜欢
  • 2018-04-05
  • 2020-01-16
  • 2011-06-05
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多