【发布时间】:2011-01-28 19:31:28
【问题描述】:
在我的 Android NDK 应用程序中,C++ 库在与 ui 线程不同的线程中运行。来自 C++ 的 JNI 调用创建 Java 类 Foo 的实例。我想在 UI 线程上创建另一个 Java 对象 Bar 来调用 Foo 上的方法。我怎么做?
难度奖励:Foo 有几个本地方法,它们从 C++ 库中调用相应的 JNI 函数。如何确保这些调用是线程安全的?
难度奖励2:Bar 的一些方法实际上是回调方法的覆盖,特别是WebViewClient。某些方法的返回码取决于调用 Foo 方法的结果。所以对 Foo 的调用需要立即发生。
【问题讨论】:
-
事实上,需要线程同步结果的整个设计可能很糟糕。除非 JNI 库是旧版或第三方库,否则请考虑将 Foo 移至 UI 线程。
-
您可能应该首先忽略通过 JNI 调用方法这一事实。线程安全问题与您使用的编程语言无关。
-
难度奖励3!这都是正在开发的跨平台库的一部分。客户端主要使用 C++ 接口,它在 Android 上运行在与 UI 不同的线程上。这部分设计是不可变的,我无法访问。因此难以实施。
标签: java c++ android java-native-interface android-ndk