当前位置: 首页 > 知识库问答 >
问题:

回调函数是否在JNI函数中复制jnienv、jinstance?

令狐翰
2023-03-14

我传递给Builder的lambda被填充到class Name对象中,并定期(每小时)调用以刷新其他成员。它第一次被成功调用。我不确定lambda是否保留了env实例来合法地调用反向JNI函数?

JNIEXPORT jint JNICALL
Java_com_company_app_ClassName_JniInit(JNIEnv *env, jobject instance){
  int data = 0;
  auto builder = new Builder(data,
        [env, instance]() -> std::string {
            std::string stringObj = populateData(env, instance); // This function makes a reverse JNI call to get data from a java function in the class
            return stringObj;
        }
    );

  std::shared_ptr<className> = builder->build(); 

  return 1;
}

我好像收到了11号信号错误,西格夫。这种分段错误是否可以以任何方式捕获,这样应用程序就不会崩溃?

致命信号11(SIGSEGV)、代码1(SEGV_MAPERR)、故障地址0x228(在tid 21785(类名)中)、pid 21573(.company.app)

它似乎在populateData-

jString data=(jString)(env)-

有没有办法在调用之前检查这个函数是否会失败?我检查了envpopulateData中的JNIEnv*参数)是否为NULL,但它不是空的,并且与实例populateData中的jinstance参数)一起有一个有效的地址。


共有1个答案

郎鸿
2023-03-14

如果这个函数异步执行某些操作,那么jobject实例就会出现问题。原因是,在启动该函数之前,Java会将该对象标记为具有额外引用。当它返回时,它会将其移除。因此,在返回后,如果Java代码中没有其他实例,垃圾收集器可以清理对象。

这可以通过在主线程上启动异步函数之前调用NewGlobalRef(JNIEnv*env,jobject obj)来解决,当不再需要jobject时,在回调结束时调用DeleteGlobalRef

 类似资料:
  • 问题内容: 我需要使用“接口”在Java中实现回调函数。我已经将应用程序部分写为 m_GetSizeInterface是一个包含回调函数GetSize的接口。此GetSize方法在应用程序中被覆盖。在JNI中,我需要调用具有原型的CPP函数 如何将此GetSize作为参数传递给JNI中的MyCPPFunction?请帮忙 问题答案: 这里的复杂之处在于您要调用本机C ++代码,而您又要调用Java

  • 我有一个通知组件,我有一个超时设置。超时后,我调用。 我想做的是,如果已经超时,我想只呈现任何内容: 问题是: 返回();//这里有一些语法错误

  • 可能重复: 参考:为什么我的Javascript中的PHP代码不起作用? 我已经研究了好几天了,似乎找不到任何东西可以让我做我需要做的事情。 我试图做的是从Javascript调用另一个文件中的Php函数。我的联系人表单上有一个验证码,还有一个Javascript文件,用于检查表单并在用户遗漏任何内容时提醒用户。我的问题是我不能检查验证码。 这是我调用Javascript和Php的链接 这是我的J

  • 回调函数 返回上级 DDEnumCallback DDEnumCallbackEx EnumModesCallback EnumSurfacesCallback EnumVideoCallback DDEnumCallback 返回目录 DDEnumCallback是用于DirectDrawEnumerate函数的应用程序定义的回调函数。 BOOL WINAPI DDEnumCallback( G

  • 上一节中介绍了Fullpage的方法函数,那些函数只适合单独使用,如果想更加详细的控制Fullpage,就需要使用回调函数,接下来得文档将为您详细介绍Fullpage中的回调函数使用方法和参数。 afterLoad (anchorLink, index) 滚动到某一屏后的回调函数,接收 anchorLink 和 index 两个参数。 anchorLink 是锚链接的名称 index 是secti

  • 回调函数(当设置onInit, onSelectStart, onSelectChange或 onSelectEnd选项)接收两个参数,第一个选项是这个插件所应用图像的引用,另外一个则是呈现当前选择的对象,这个对象有六个性质。 性质 描述 x1 y1 选择区域左上角的坐标 x2 y2 选择区域右下角的坐标 width 选择区域的宽度 height 选择区域的高度 为了便于理解,下面给出当选择完后执