2011-12-05 28 views
1

私は自分のアプリケーションでC++のlibを使っています。私はjniにJavaオブジェクトを渡し、グローバル参照に保存しました。次に、私はこのJavaオブジェクトのメソッドをantiherスレッドのjniから呼び出したい(私はpthreadを使う)。FindClassとGetMethodIDはandroid jniで失敗する

Javaクラスは次のとおりです。

jvm->AttachCurrentThread(&env, 0); 
cls = env->GetObjectClass(__obj__); // __obj__ is global reference to object. 
if (!cls) 
    goto detach; 
mid = env->GetMethodID(cls, "ready", "(Ljava/lang/String;)V"); 

GetMethodIDは方法を見つけることがあります失敗します。

public class WaitingServiceReadyCallback { 
    public void ready(String serviceName) throws Exception { ... // some code } 
} 

私は次のコードを使用するJavaメソッドを呼び出します。私は

cls = env->FindClass("com/mypackage/WaitingServiceReadyCallback"); 

の代わりGetObjectClassを使用する場合 、FindClassは、このクラスを見つけることができません。

私は(readyへの呼び出し上記のように私のコードの同じ場所にgetNameへの呼び出しを行った、com/java/ClassからgetNameを使用)、私は右のクラス名を持って私の__obj__グローバル参照によってreferencdオブジェクトのクラス名を確認しようとした - com.mypackage.WaitingServiceReadyCallback

私はクラスが存在し、読み込まれていることを確信しています(このクラスのインスタンスがそこに作成されている前にJavaコードが実行されています)、私はそのメソッドがクラスに存在すると確信しています。

私は間違ったことを理解できません。

答えて

2

この問題が発生しました。理由は簡単です:別のスレッドVM内では、ロードされたクラスについての情報は提供されません。私はいくつかのサンプルJavaオブジェクトのクラスローダーを格納し、それを使って別のスレッドから必要なクラスを手動でロードすることでこれを解決しました。

関連する問題