JniHelper找不到java class,但是同一个class前面刚刚被调用过

C++代码里通过JniHelper调用安卓上的java代码,日志里说找不到java class,但是这个类前面刚被成功调用过。
找了半天没有头绪,有点挠头,有人遇到过这种情况吗?

日志:

06-15 15:13:11.311 31237 31283 D JniHelper: JniHelper::getStaticMethodInfo, className=com.game.CallJava, methodName=resetContent, paramCode=()V
06-15 15:13:11.311 31237 31283 D JniHelper: JniHelper::getJavaVM(), pthread_self() = -835851920
06-15 15:13:11.311 31237 31283 D JniHelper: JniHelper::getEnv, env=0xeee33d10
06-15 15:13:11.311 31237 31283 D JniHelper: JniHelper::_getClassID className=com.game.CallJava
06-15 15:13:11.311 31237 31283 D JniHelper: JniHelper::getJavaVM(), pthread_self() = -835851920
06-15 15:13:11.311 31237 31283 D JniHelper: JniHelper::getEnv, env=0xeee33d10

…………

06-15 15:13:11.581 31237 31283 D JniHelper: JniHelper::getStaticMethodInfo, className=com.game.CallJava, methodName=isServiceAvailable, paramCode=()Z
06-15 15:13:11.581 31237 31283 D JniHelper: JniHelper::getJavaVM(), pthread_self() = -835851920
06-15 15:13:11.581 31237 31283 D JniHelper: JniHelper::getEnv, env=0xeee33d10
06-15 15:13:11.581 31237 31283 D JniHelper: JniHelper::_getClassID className=com.game.CallJava
06-15 15:13:11.581 31237 31283 D JniHelper: JniHelper::getJavaVM(), pthread_self() = -835851920
06-15 15:13:11.581 31237 31283 D JniHelper: JniHelper::getEnv, env=0xeee33d10
06-15 15:13:11.581 31237 31283 E JniHelper: Failed to find class com.game.CallJava
06-15 15:13:11.581 31237 31283 E JniHelper: Classloader failed to find class of com.game.CallJava

也有可能是返回值,参数之类的填错了

一开始我也以为是,瞪着眼睛对比了好多遍

更新一下线索,我在Activity里覆盖了超类的getClassLoader方法,JniHelper调用这个方法获取了一个自定义的class loader用来load class填充JniMethodInfo。

我在这个自定义的class loader里加入了一些日志,没有发生调用错误的情况下,都是进入的这个class loader的loadClass。
唯有发生找不到java class那一次,日志记录里没有loadClass的日志,似乎并没有使用到这个自定义的class loader。但从JniHelper里打出来的日志,无论哪一次,classLoader的指针都是同一地址,说明JniHelper的classLoader并没有被替换。
紧接着之后的loadClass就又都正常了,哪怕是用的同一个className。

之后解决了,是渲染线程通过jni调用到java代码,被调用的java代码正好操作了android UI。
加了异步事件,让UI线程去操作UI,就没这个问题了。

1赞

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。