Android jni调用java实例方法无声地失败

时间:2014-09-16 15:48:25

标签: java-native-interface

我从一个包中调用一个jar包。 jar虽然使用了复杂的分层结构和新的抽象/对象/线程定义和实例化,但是很好地打包并向外部暴露了一个非常狭窄的接口。我相信这是一种常见的情况。

我正在从jni代码(在我的一个pthread中)进行单向调用,以便在jar中使用java代码。我所期望的是用jar调用窄接口,然后jar会做所有并返回。

现在我可以成功调用实例方法w /参数传递。但是,如果我调用的方法创建一个新对象,它会无声地失败,如下所示:

Java代码:

public void AAA(){
    Log.i(...); <-----------------Successful
    new BBB(this); <--------------Don't know what happened
    Log.i(...); <-----------------Not successful
}

我把一些打印作为BBB构造函数的第一行,它没有出来。

任何人都可以帮助我吗?感谢。

1 个答案:

答案 0 :(得分:0)

原因是BBB内部声明了一个处理程序,但实例化BBB的线程(表示jni pthread)没有准备好Android looper。在进入和退出主题时添加以下代码:

输入: (* env) - &gt; CallStaticVoidMethod(env,cLooper,mPrepare);
退出: (* env) - &gt; CallStaticVoidMethod(env,cLooper,mLoop);

当然,您还应该在您的本机代码中的某处准备cLooper,env,方法ID等。