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

 2023-01-20    258  

问题描述

我有大量的Java代码(仅计算功能,没有UI),我想将其重复使用为iOS中的静态库.我的方法是使用 robovm ,并按照非正式的方式创建Robovm论坛中两篇文章中描述的静态库: 1个基本方法和试图完全按照描述的步骤遵循这些步骤,不幸的是,我在与脚本创建共享库后不幸地陷入了困境,并将库(.a)链接在Xcode中并成功地构建项目.

在运行时,我看到我的C ++桥代码被调用,但JNI用BAD_ACCESS呼叫回到库中.例如,以下行崩溃:

从Robovm项目中创建iOS静态库(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时,您的代码将调用这一点.您需要通过APP路径,在测试时可以进行硬码.

initrobovm()将需要一些修改,即,它不应称呼您的Java应用程序的主要方法,至少,这就是行为良好的库不应该做的IMO.它也不应致电rvmshutdown.

以上所述是小编给大家介绍的从Robovm项目中创建iOS静态库(JNI中的BAD_ACCESS)。,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26055.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。