抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

记一次JNI需要返回值而未返回值导致的大坑

业务场景与现象:

一个保存动作,执行完应用便崩溃。崩溃日志为: fault addr xxxxxx 等一堆无意义java层堆栈。

JNI异常问题的常见处理办法:定位问题代码

其方式多为:

  • log打印
  • debug 断点
  • 自行语法检查

这个问题其实非常非常简单,就是自己加了一个接口并且希望返回一些内容,但在jni代码中 忘了返回内容,由于IDE并未提示也未报错,一直未能找到原因。

过程:

从debug情况看,每一行均可正常执行,执行完便崩溃。

从log日志看,每一行均可打印完成,最后一个打印完成后便崩溃。

按网上的 jni exception 检测,从方法执行第一行起就崩溃。

经过大段时间的调试,最后才找问题关键点:

  • JNI 方法 返回值定义了 不接收 不会崩溃
  • JNI 方法 返回值定义了 接收 但实际上JNI方法无返回 会直接崩溃

上个图吧:

没有返回值编译不会报错,但如果要用,运行时会报错,而且无法捕获。

又是一个巨简单问题导致的大耗时。没认真学 JNI 就是如此下场,临阵磨刀,杀不了敌人,只能杀自己。


1条评论

发表评论