2011-12-05 91 views
1

我有用於我的應用程序的C++ lib。我將java對象傳遞給jni並將其保存到全局引用。然後,我想從antoher線程(我使用pthread)從jni調用此java對象的方法。Android上的FindClass和GetMethodID失敗jni

Java類是:

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

要調用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未能找到方法。 當我使用

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

,而不是GetObjectClassFindClass無法找到這個類。

我試圖用我的__obj__全局引用檢查對象referencd的類名(從com/java/Class使用getName,在同一個地方我的代碼如上調用ready作出呼籲getName),我得到了正確的類名 - com.mypackage.WaitingServiceReadyCallback

我確定該類存在並加載(在jni之前執行的java代碼以及該類的實例在那裏創建),我相信該方法存在於類中。

所以,我不明白,我做錯了什麼?

回答

2

我遇到了這個問題。原因簡而言之:在另一個線程內,VM不提供關於加載類的信息。我通過存儲一些示例java對象的類加載器,然後使用它從另一個線程手動加載所需的類來解決此問題。