【问题标题】:JNI Callback to Java on non UI thread在非 UI 线程上对 Java 的 JNI 回调
【发布时间】:2012-12-13 14:28:19
【问题描述】:

我在 java 中创建了一个线程,它使用 JNI 将数据传递给旧版 C++。 C++ 代码在单独的线程上执行一些任务然后返回,此时我想从 JNI 回调到 Java 线程而不是主接口线程。代码似乎可以毫无错误地构建和运行,但是当调用 CallVoidMethod 以回调 Java 时,什么也没有发生,没有异常或错误,它似乎确实调用了 Java 代码。

我正在调用 AttachCurrentThread,它似乎工作并在最后分离,查找方法的调用似乎都成功了。有没有人有任何想法或我有错误的想法?

【问题讨论】:

  • 在您正在调用的方法的开头添加一条日志语句,以查看它是否被调用。确保在 JNI 代码中调用 ExceptionCheck 以查看 CallVoidMethod 中 Java 端是否出现故障。你说“什么都没有发生”,但也说“似乎调用了 Java 代码”,所以我不太确定你看到了什么或者它是如何失败的。
  • 如果您粘贴代码,我们可以给您一些建议

标签: android multithreading android-ndk java-native-interface


【解决方案1】:

没有解决此类问题的灵丹妙药;你可能会让任何一个小事情出错。我建议从一些不起作用的代码开始违反直觉。故意设置方法ID错误;看看系统的行为有何不同。将对象引用(或类引用,如果是静态方法)设置为意外对象,或不存在的对象;看看当对象引用没有被全球化时会发生什么......你明白了。

【讨论】:

  • 支持全球化对象引用——事实证明,如果我想保留对当前方法和线程范围之外的对象或类的引用,我需要调用NewGlobalReference()。请参阅 developer.android.com/training/articles/… 以获得有关此方面的良好指南。
猜你喜欢
  • 2017-12-02
  • 2014-03-23
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多