Android/Java:如何调用在不同线程上创建的对象的方法? 在我的Android NDK应用程序中,C++库运行在与UI线程不同的线程中。一个来自C++的JNI调用创建java类FoO的实例。我希望在UI线程上创建另一个Java对象栏来调用Foo上的方法。我该怎么做 难度奖金:Foo有几种从C++库调用相应JNI函数的本地方法。如何确保这些调用是线程安全的

Android/Java:如何调用在不同线程上创建的对象的方法? 在我的Android NDK应用程序中,C++库运行在与UI线程不同的线程中。一个来自C++的JNI调用创建java类FoO的实例。我希望在UI线程上创建另一个Java对象栏来调用Foo上的方法。我该怎么做 难度奖金:Foo有几种从C++库调用相应JNI函数的本地方法。如何确保这些调用是线程安全的,java,c++,android,java-native-interface,android-ndk,Java,C++,Android,Java Native Interface,Android Ndk,难度奖励2:Bar的一些方法实际上是回调方法的重写,特别是WebViewClient。某些方法的返回代码取决于调用Foo方法的结果。所以打电话给Foo需要立即进行 尝试处理程序类。在Foo构造函数中构造一个处理程序。以某种方式将引用传递给Bar类。具有Bar调用处理程序.post() 要使其工作,线程需要有一个消息队列。如果它是一个纯工作线程,那么直接调用方法就不是答案;AFAIR没有线程中断机制。为了将内容传递给工作线程,您需要稍微模拟一下消息队列——拥有一个可运行对象队列(该条将添加到其中)

难度奖励2:Bar的一些方法实际上是回调方法的重写,特别是WebViewClient。某些方法的返回代码取决于调用Foo方法的结果。所以打电话给Foo需要立即进行

尝试处理程序类。在Foo构造函数中构造一个处理程序。以某种方式将引用传递给Bar类。具有Bar调用处理程序.post()

要使其工作,线程需要有一个消息队列。如果它是一个纯工作线程,那么直接调用方法就不是答案;AFAIR没有线程中断机制。为了将内容传递给工作线程,您需要稍微模拟一下消息队列——拥有一个可运行对象队列(该条将添加到其中)并不时检查它


确保线程安全是一个独立的大问题。所以对于这个主题所说的和所做的一切来说,它还不够大。

所以你有线程1和线程2,线程2创建了一个对象,线程1有一个对象想要调用线程2中的对象

你能不能在线程2上用java编写一个对象,并使用标准的java线程同步技术,比如使用synchronized关键字

例如线程上的java代码:

    // object of this type instantiated on thread 2 and called from thread 1
public class thread2Class  {
    public void doSomething(...) {
        synchronized (this) {
           // call java or jni mthod
        }
    }
 }

消息中嵌入通知程序回调例程的双消息队列。 线程1在线程2队列上发布带有回调地址的消息。 线程2处理消息并在线程1的队列上发布结果通知。 线程1调用与其发布的原始消息相关联的回调例程。 线程1队列是UI消息队列,线程2是您自己选择的队列实现。 线程2是库调用的管理器/包装器。 不阻塞,不等待。
如果线程1必须管理状态,则让它更新一个状态模型,该模型控制响应到达后发布的消息。

我可能会尝试使用类似
beginInvoke()
的方法将消息以适当的方式排入线程队列。需要注意的是,
beginInvoke()
可以用任何一种方法或正确使用的方法进行模拟。

我曾考虑使用某种消息队列,但我被一个showsupper绊倒了:Bar的一些方法实际上是回调方法的重写,特别是WebViewClient。某些方法的返回代码取决于调用Foo方法的结果。所以打电话给Foo需要立即进行。我将把这个细节添加到我的主要帖子中。所以线程阻塞是正常的。这相当糟糕;让UI线程等待工作线程响应会扼杀线程的全部目的。更不用说是非常脆弱的(如果员工不响应怎么办?)。这就是说,Object.wait()和notify()方法是你的朋友(有时是敌人)。事实上,整个设计都需要线程的同步结果,这可能很糟糕。除非JNI库是遗留的或第三方的,所以考虑将Foo移动到UI线程。您应该开始忽略通过JNI调用方法的事实。线程安全问题与您使用的编程语言无关。难度加成3!这些都是正在开发的跨平台库的一部分。客户端主要使用C++接口,Android上的界面与UI不同。设计的这一部分是不变的,我无法理解。因此,实施这项计划有困难。